像我儿子一样永远保持好奇和梦想

[zhuan]调试 configure当程序不能编译时怎么办

上一篇 / 下一篇  2012-09-07 10:06:50 / 个人分类:linux

   ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台H EY5gxR&a[

现在许多开放源代码的程序都会附带有 configure 脚本。这种脚本的用途之一是自动进行对目标新系统的猜测过程。在过去,程序会附带一个 Makefile 文件,这个文件中有 6 个不同的编译标记和选项,但只会用到一个,其余全部注释掉,并且会有一个注解,告诉您“为您的系统选择合适的标记”。如果配置选项更复杂,可能还会有一个名为 config.h 的长长的 C 头文件,其中包含一些要设置的标记,这依赖于主机系统变量。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;coK8AZ a hI

n&v!R+[}-H0第一个方法很简单,在代码中使用 #ifdef 以支持两种系统,例如 BSD 和 System V。由于 Unix 的类型的增加,更为实用的方法是对每一个特性使用 #ifdef 。每个系统的代码如下:

%_ \Oz#j{0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台a;u&dbk8K{ mx
清单 1. 每个系统的代码
$hi nTW!Q`?&_}!s0
    #ifdef SUNOS4 || NEXT || NETBSD || FREEBSD || OPENBSD
    #include <string.h>
    #else
    #include <strings.h>
    #endif
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台`S k VBhy

vj,G-]%N ^2Y0每个特性的代码如下:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台b#Wj,G3~2O.J3A5i

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台w$zA(o-}#E2o3_.F'c~
清单 2. 每个特性的代码
wp:v&dsmt0
    #ifdef HAS_STRING_H
    #include <string.h>
    #else
    #include <strings.h>
    #endif
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0] B P0W!hfl8WR7o(a
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"D.bCG_G%o6sj5Y

后者更容易适应新系统,但需要开发者进行大量的工作。由于现在有太多可能的目标系统,因此,第二种方法对用户来说帮助很大,不仅仅是可以自动生成配置头文件。完成这项任务的一种方法是使用 GNU autoconf 代码来生成 configure 脚本。这个脚本会去执行必要的测试,并创建一个具有适当值的配置头文件。

.IAUraF0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台A:E)Y N$c7F-l A&^k

这种脚本的另一个功能是以一致的方式设置预定义的变量。用手工编辑标记一直存在一个问题,即修改了 Makefile 文件(比如将其安装到 /usr/gnu 而不是 /usr/local 目录下)却忘记修改头文件中相应的值。当然,这样的结果是,编译后的程序不知道到哪里去寻找它们自己的数据文件。使用 configure 脚本的一个好处是可以自动完成一致的安装(如果维护者做得没错的话)。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台V#ebV9B$~P]6q:G

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台k O(S7t9y,m nt ]#e

开发人员请注意,一个好的 configure 脚本的另一个好处在于,它会允许用户指定一些个人偏好,例如使用 /usr/gnu 而不是 /usr/local。

+yyF6K:L0

*i8OJRwm?2d0最后, configure 脚本可以完成大量猜测工作,即安装了哪些可选软件包或缺少哪些必要条件。例如,一个设计运行于 X Window System 的程序需要知道 X 安装在哪里,或者甚至要知道 是否安装了 X。

[f;Ppz AXW2O0

:~J N@P6l wC0这些如何成为可能?

0w!\*`w8d3N|nFN}0

编译,再编译ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Ht{0l2Dk6bD(H0E]0N

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d\#N7n/Ri#DX

configure 的许多功能实现机制其实很简单。为了能切身体会,您可以设计一个小测试程序,这个程序当且仅当期望的条件得到满足时才可以编译。将它保存在一个临时文件中,然后尝试编译它。例如,假定您想知道 X Windowing System 是否安装在 /usr/X11R6 目录下。一种方法是做一个如下的测试程序: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$Kn*{#XH v]$S1z SI

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1UDj3u mA0@ W

#include <X11/X.h> ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%yT W%VPg
int main(void) { return 0; }

2Nqp'{\&dT~0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!w'[b+Bj"nF1p

现在,如果您用编译器来尝试进行编译,那么只有当 <X11/X.h> 在编译器的 include 路径中时,编译才会成功。因此,对每一个您认为 X 可能安装到的目录,可以将对应的 (directory)/include 加入到编译器的 include 路径中,并尝试对程序进行编译。如果采用某个值时示例文件可以编译,那么您就得到了正确的 include 路径。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$Mw7H6ZN:F

(^T5d3mz9FrB;Z0请注意在 autoconf 中已经预定义了各种测试程序。如果可能,就直接使用这些测试程序,而不用自己去写。这样有很多好处。首先, autoconf 的新版本会改进这些测试程序,修正它们的错误,否则您将不得不自己去做这些工作。其次,这样会节省您的时间。当然,更好的方法是完全避免测试。如果您确认某一个测试是没有必要的(例如,即使机器字节多于 8 位也仍需要使 sizeof(char) 为 1),您可以完全不去进行这个测试。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台ot6Xa3P7Fq:f

6WUr:O$X4fI0有一些测试是功能测试;它不足以确定是否存在一个名为 memcmp() 的函数,它的语义必须正确。通常,这些测试用于只是在一两个平台上被注意到的非常不明显的错误。这些测试实际上会去运行测试程序,并检查它的输出。测试程序遵循标准的 Unix 习惯:如果测试通过则返回值为 0,如果失败则返回一个非 0 值。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 L.b}}jQ7y*t`

f$K W4X,`7i:h;b0一旦您有了足够的测试程序,您可以用它们来自动确定必需的编译标记和定义,以将它们放到头文件的某个地方。通常, configure 脚本会允许用户给出部分或全部已知的条件,而不是让脚本自己去猜测。

*M"d*P"z!fKI0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'ST6l1d,A

来看一个特例,假定,系统的 broken memmove() 出现了问题。如果您不知道它现在有一个只会影响少部分程序的 bug,您可能会编译一个程序并将其发布为产品,而没有意识到这样您将会遇到偶然的灾难性错误。

)|.D!iB| u9iL,w0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0Q*^_,[%Z^h

在许多情况下,一个冗长而复杂的 configure 脚本的最终结果是这样的:目标系统提供了这个程序用到的每一个标准特性,而且它们正确工作。在这种情况下为什么不手工去设置这些标记呢?这对开发者来说是可行的,而对众多用户来说就不可以了。用户可能不会知道到他们的 Linux 版本存在特定的 bug。他们可能不知道已经安装了哪些软件包,或者安装到了何处。脚本帮那些最需要帮助的人来完成大部分的例行公事的工作。当脚本出错时,引发的额外工作的代价可能不会太大。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台{;v5|} O AI


错在何处?ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(V#{-FXKr,D:An

e0N6d$AI0既然您已经基本上了解了 configure 都做了些什么工作,您可以开始寻找错误了。有两种可能的 configure 错误。一种是 configure 是正确的,而您的系统缺少必要的先决条件。绝大多数情况下, configure 脚本会正确诊断出这种错误。更为麻烦的情况是 configure 本身的错误。这样的结果或者是不能生成配置,或者生成一个不正确的配置。

M@|`#SI;s0

[!VZ `6L0configure 的猜测无误,而您缺少先决条件时,您所要做就是要满足缺少的那些先决条件。当您找到并安装好后,再重新运行那个报告缺少先决条件的 configure 脚本,就可以成功了。(不要忘记删除 config.cache 文件,这个文件缓存了上一次测试的结果;您应该让 configure 从头开始。) ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台W c"GQo"b+o K

K&wO!ja$e\0如果您正在开发 configure 脚本,您需要确保您给出的错误消息有意义。如果您测试的是一个函数,而这个函数是一个常见的可添加的软件包的一部分,那么不要告诉用户缺少的函数的名称 —— 告诉用户他们需要的软件包。确保将先决条件信息写入 README 文件中。并且,请一定要告诉人们您测试使用的其他软件包的版本号。

h}P&S8`t;hi0

(d+U"V2q uEa?R0当然,即使在先决条件需要的软件安装以后,configure 脚本可能还是找不到新安装的程序。在这种情况下,您又回到了当 configure 猜测错误时应该如何去做。

~#q|{$T!JW N2}%K0

阅读文档

w;Yn Q%u0

8S`3oY;Fq*TZa p4U x0无论何时,当 configure 失败时您首先要做的是运行 configure -h ,并检查参数列表。如果它找不到您确认已经安装的库,您可能可以指定到另一个位置来找到这个库。您还可以禁用和启用某些特性。例如,用于 Angband (一个 Roguelike 游戏)的 configure 脚本有一个可选的标记 —— enable-gtk ,以告诉脚本在编译时启用 GTK 支持。如果没有这个标记,编译时根本不会去尝试。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台VO$U fs sPM

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$g,Qw"q1mY K{G

如果您的系统配置得比较奇怪,您可能不得不为 configure 脚本设置一些非常详细的变量,而且如果是在交叉编译,您很可能得做一些非常特别的事情。 CCconfigure 用于指定 C 编译器的变量,通过指定 CC 的值可以解决许多问题。如果您指定了编译器, configure 将使用那个编译器而不用去猜测需要使用哪一个。要注意的是,这样您可以在命令行中指定选项和标记。例如,如果您希望编译时支持调试符号,尝试:

w+f2nE(xm1? }I0

-y?Z&JO$x7Qd0CC="gcc -g -O1" ./configure

r1T/P*O`;~0

p^-{'RmE-tozx0(这里假定您使用的是 sh 系列的 shell;在 csh 中,用 setenv 来设置环境变量 CC 。) ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(y.xPj#Cg

阅读 config.log

,M R$})l9r)c4~7W0

mc%d7m'xm0L0configure 脚本运行时,它会创建一个名为 config.log 的文件,其中记录的是测试日志和得到的结果。例如,一个典型的 config.log 片断如下: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$Pw9_/N)i/b.rX0I


/Qc+ZV-B0清单 3. config.log 的典型内容ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 ?!^0g-q!x1ed4i
    configure:2826: checking for getpwnam in -lsun
    configure:2853: gcc -o conftest -g -O2 -fno-strength-reduce conftest.c -lsun >&5
    ld: cannot find -lsun
    configure:2856: $? = 1
    configure: failed program was:
    (a listing of the test program follows)
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台}S;j wy$~
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!g&j5a,^O+K P `

如果我的系统中, -lsun 应该提供 getpwnam() ,我应该可以使用命令行来对其进行确切检查,然后再使用测试程序。只需进行少量这样的调试,我就可以根据得到的信息来修改 configure 脚本。请注意有帮助的行号;这个测试从 configure 脚本的第 2,826 行开始。(如果您是一个 shell 程序员,您可能会喜欢在阅读 configure 脚本片断时打印出行号;在 shell 中 $LINENO 不能自动地被扩展为合理值,脚本使用 sed 创建一个包含有行号的自身拷贝!)

(?-J4yVg0

3\!M%q:zrVAX0当一个测试失败或者得到意外的结果时,最好先去读一读日志文件。请注意,有时测试失败仅仅是因为上一个测试的失败,这种失败实际上并不重要。例如, configure 可能会因为找不到一个您闻所未闻的库而退出,而这可能是因为测试标准 C 库中某个功能的程序失败而导致无法找到那个库。在这种情况下,只需要解决第一个问题,第二个问题也就不会再出现了。

"Lgd!mx#d0

有 bug 的测试程序

]`SC+AD$?0

5O[0j{0K1j WD.C0在其他一些情况下, configure 可能会偶而出现猜测错误。一种情况是测试程序设计不正确而可能在一些系统中编译失败。例如,考虑如下用于判断 strcmp() 函数可用性的测试程序:

u C!gv+}5q3E-\0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台T;vP}D2s6G+V}
清单 4. strcmp() 可用性测试程序ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台3Z2a6Pd w7u6T%a:P
    extern int strcmp();
    int main(void) {
                    strcmp();
    }

"?(G TzM \Q0

(t5Hu6]o S F,T0编写这个程序是为了避免使用 <string.h> 头文件。这样做的意图是,如果 strcmp() 在库中可以找到,程序将可以被正确地编译和链接;如果没有找到,链接器将不能解析到 strcmp() 的引用,程序编译就会失败。

x[s$F8K*]%S0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台nf!["Jj

在 UnixWare 编译器的某一个版本中,对 strcmp() 的引用被自动转换为 Intel 处理器自己的字符串比较指令。这个过程只是将传递到 strcmp() 的参数替换到一行汇编代码中。不幸的是,前面的例子程序调用 strcmp() 时没有给出参数,因此生成的汇编代码无效,从而导致编译失败。实际上您可以使用系统中的 strcmp() ,但是测试程序错误地认为缺少这个函数。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台p\$C$xxr_rZDf

QkS#jtj"~dL.o0autoconf 的目标为主流平台(特别是各种 Linux,但是还包括主要的 Unix 发行版本)时,极少出现有 bug 的测试,这种有 bug 的测试通常是在那些没用被广泛测试过的平台或编译器上运行测试的结果。例如,UnixWare 上的 gcc 不会发生前面的 bug;只是在使用系统本身的开发包进行编译时才会发生。通常,最简单的解决办法是在 configure 中注释掉相应的测试,并直接设置出问题的环境变量。

v3t1gr9y:h'^~0

编译器不真正工作

!X.G O @CB0

5o3t6h%S#{y0有时 configure 前阶段选择的编译器标记可以链接可执行文件,但最终生成的可执行文件却不能运行,这是一个特别致命的错误。这会导致测试无缘无故地失败。例如,如果您使用的链接器命令是错误的,虽然您可能会正确地进行了链接,但却不能运行。到完成本文时, configure 脚本还不能发现这一错误,所以只有那些需要目标程序运行的测试才会报告失败。这对调试来说是非常不可思议的,但是通过 config.log 脚本可以弄明白是哪里出了问题。例如,在一个测试系统中,我得到了这样的输出: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台``P B pd*C


j,[ biCa[3n/? V0清单 5. 测试 config.log 输出
].dxze%u w0
 
    configure:5644: checking for working memcmp
    configure:5689: gcc -o conftest -g -O2 -fno-strength-reduce
        -I/usr/X11R6/include    -L/usr/X11R6/lib conftest.c -lXaw -lXext
        -lSM -lICE -lXmu -lXt -lX11 -lcurses  >&5
    configure:5692: $? = 0
    configure:5694: ./conftest
    Shared object "libXaw.so.7" not found
    configure:5697: $? = 1
    configure: program exited with status 1

BpXi,rjx8\!L0

0?GJ8n2w3gj)U]WH*N0真正错误在于,编译器需要一个单独的标记来告诉它 /usr/X11R6/lib 需要在搜索目录列表中出现,这样在运行时才可以找到动态链接库。无论如何,这是第一个这样的测试,它真正运行编译过的测试程序,而不是程序编译成功后就停止。这是一个非常精妙的问题。

R.?9q V)r*U$Y(w8^0

XPc@6N7R0在这个系统中,解决的方法是添加ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:w p4@4sYO

0D8WE/ZE#V8d_2~)S0-Wl,-R/usr/X11R6/lib ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台mCh%}0p

)k:Em-q K*K0CFLAGS 变量中。命令行:

`y4W L*I-` T9Gq0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台1~6ZMA;X u&Md B

$ CFLAGS="-Wl,-R/usr/X11R6/lib" ./configure

vqP&{+r0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Vj"R3i+d Z8S

允许 configure 正确地运行这个测试。

-^#NZ4i7GYQ!O-\I#QP0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台p \:O5fL0p(jW-l

这对交叉编译尤其不利,因为您可能不能运行实际上是由交叉编译器创建的可执行程序。最近的 autoconf 版本都尽量避免要求测试程序实际运行的测试。

u0~-fH1nG4Q%e0

找到缺少的库和 include

`%J{'R${,OEf0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台4R u6P"g*s"|Gme`

使用 configure 脚本的另一个常见的问题是,如果一个特定的软件包安装到了一个非常规的位置, configure 将无法找到它。好的 configure 脚本通常允许您指定所需要的文件的路径,因为它们可能被安装到与众不同的位置。例如,许多 configure 脚本用一个标准的方法来告诉脚本到何处去寻找 X 库: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台w/t,[g1u q

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台^~t3L G[*q*SU
清单 6. 寻找 X 库ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台*B8aJIF6@M*B8f1oG
    X features:
      --x-includes=DIR    X include files are in DIR
      --x-libraries=DIR   X library files are in DIR
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5mX"xYO%Pn

+p3Z:h'H'B m0如果这样仍不行,您还可以尝试使用完全强制的方法:指定需要的编译器标记为您的 CC 环境变量或者是 CFLAGS 环境变量的一部分。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台4A3J3Z+X3zn?

其他技巧ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9s(^|P:p%J^

bF^+R-W1gE~0如果开发者给出了 autoconf 用于生成 configure 脚本的 configure.in 文件,一个工作区将运行最新版本的 autoconf 。可能这样就可以了,但即使不能很好地工作,这也可以解决一些问题。这样做的目的是更新用到的特定测试;它在旧版本的 configure 中可能就是一个引发问题的 bug。就此而言,如果您是这种情形下的开发者,请一定要发布您所用到的 configure.in 文件。

mU'H7`%Gp0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台`h3FpX0E

如果您经常要反复调整您传递到 configure 的参数,而且您并不擅长 shell 命令行编辑,那么可以做一个包装器脚本,这个脚本以适当的参数调用 configure 。经过一些调整和一些失败的测试后,您的脚本可能会是这样: ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台f.h%_NW2Iu*u


;E2LX*`#r0清单 7. 包装器脚本ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台T;^[*|["Mu?
    ./configure --with-package=/path/to/package \
       --enable-widget \
       --disable-gizmo \
       --with-x=29 \
       --with-blah-blah-blah
       CFLAGS="-O1 -g -mcpu=i686 -L/usr/unlikely/lib \
          -I/usr/unlikely/include -Wl,-R/usr/unlikely/lib"

oV2iem nW+y4p0

vNEC*b,s"OXj0相对于一遍又一遍地在命令行中输入,将脚本放在一起将很方便 —— 而且以后您还可以引用它,或者将它的一个拷贝寄给别人。

F:f:]dg0

PZ*a7aZ0

开发健壮的 configure 脚本

x/G9B8o9},UYl J0

UO)_oB*C0一分预防胜似十分治疗。要使 configure 脚本工作的最好方法就是在生成它的时候尽力确保它不会出错。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台P/M%r amnB

w5b%dAmly0当尝试构建一个健壮的 configure 脚本时,最需要注意的实际上很简单。永远不要去测试那些您并不真正需要的内容。不要测试 sizeof(char) ;因为在 C 中 sizeof 操作符返回字符大小的对象,以用来保存一些内容, sizeof(chare) 永远是 1 (即使是在那些字符位数大于 8 的那些机器上)。绝大部分情况下,没有理由去测试是否有权使用自 1989 版本标准出现以后的 ANSI/ISO C 中的函数或者标准的 C 头文件是否可用。更糟的是当标准的特性存在时还去测试非标准的特性。不要测试 <malloc.h> 是否可用;您不需要用它。如果您需要用 malloc() ,请用 <stdlib.h>ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&_r1~V;zS~8x/X;y,D

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台zRAD1b+Ap)j6j~

在许多情况下,相对于进行广泛的测试以找出使用的是哪一个特性,简单地除去对这个不明显特性的依赖要可靠得多。可移植的程序并不难写,十年前就已经有了。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(W y2@&XF j{'T

E u)N I,Y H0最后,尽量确保您使用的是最新版本的 autoconf 。bug 会得到极好的修正;很可能旧版本 autoconf 存在 bug,而在新一些的版本中这个 bug 就已经不复存在了。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台yb8Z0t~


/@~:Y_8b8B0

参考资料

Lo1t J9s wS'fDv^0
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文. ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台;H;T"NN-L j;Q2N5L(U'le
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'}?~m4\B:Q
  • 要获得更多资料,请访问 autoconf 主页 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台5Rfq-BN)c5?dNrK

    'SQ jbf0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%Y:x1i A&wew
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:y rp(V+vW.O Q7n,r
  • 关于 创建自动的配置脚本 有非常详细的参考资料。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台z BS{$v)Al}

    L4l@$j.X2~N1Z?C N0
    .n+M;Zj3y o'Y0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,N a^dy6qj.Ay9y%q
  • GNU.org 给出了如何 编写 configure.ac创建 configure 脚本 的建议。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台} F5Rr2B
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台X7P sO/ejN
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台|ie+^k|}"n$s7F}~
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"w;jXf]&Gd
  • 访问 GNU Make您可以学到您从未了解的知识。在 GNU.org 上您还将找到有关 Makefile 基础等信息。
    vzN%@*I$~$ii"oz%h @0
    %\5I5oL1Op%T4k|8}0
    &yE n6jC7r;G0
    /c8O;n_ V`0
  • IBM developerWorks 文章“ 交叉开发入门”探讨了交叉编译。
    ?/cn)|f`!c0
    n;]K Z^0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台j0~7xY#^t'J
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台/b1`M_ C _x
  • Erik Welsh 的 Bookmarks for Cross Compiling是一个可以找到更多特定信息的地方。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台RmLM!f

    &ePmCc#t0
    7cA9m(NkKX0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台(J_6]'B@\[
  • 尝试编写可移植的代码?请参考 10 Commandments for C Programmers.
    ApI3dNI.n Vuu0
    ^{9r5_C.mg&m;i%Y0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台lyz8kS r

    ] uR{M0
  • Red Hat 在 Autobook 有一章是关于使用 GNU 自动工具来 Writing Portable C
    iAX Q,Y^!Y0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&Nsg|`
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台|@E(Q6f N;J:MSi
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台qRO;cX
  • 就 Red Hat 而言,通过 IBM developerWorks 文章“ 用 RPM 打包软件”学习如何实现更方便的安装。
    dp9z*QbR1Ii0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台j O3z6DC
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8A;JU*o5G

    {L6o!B |0
  • 如果您是一个 Linux 新手,可以通过“ Windows 到 Linux 之旅:第 9 部分. 安装软件”来学习如何安装软件。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台~pX:tuTw+@

    4G^4O&Zs O)E?0
    iE"XK3Wo{Lc$y0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台hV-Z'i8E#_p2\
  • Angband 是 Peter 在本文中提到的游戏,您可以在 thangorodrim.net 找到其规则并下载说明。Angband 是一个 Rogue 类的游戏
    AW A#K^ f c0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台G a ?T0BoV3M
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 O&V [ `4A"`;]B
    ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台)F ig0zy"l;H:B

关于作者

!H Cz(bR!^7N0
Peter Seebach

Peter Seebach 仍然记得尝试去指出 Amiga 是否最好用 #define BSD 或者 #define SYSV 描述。本文中列出的 configure 错误他自己都曾经遇到过。您可以通过 developerworks@seebs.plethora.net 与他联系。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'yJ8~3iLKM3cL6d

关闭 [x]ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%vLYMM [?

关于报告滥用的帮助

报告滥用

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台7Gy H2j)l4}(N

谢谢! 此内容已经标识给管理员注意。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 u6O Q:W!{SH3^%}"x,O{


关闭 [x]

PH&E#Jo(]H0
关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。

Y K[@ZL:i2i0

关闭 [x]

OlMrs*a0

developerWorks:登录

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0_3_!@S^;mL`
需要一个 IBM ID? ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台"l.q4|MJh dfP'S
忘记 IBM ID?

5cuR?S#Y$N`0

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d0p cu7c^
忘记密码?ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台3{Mot!`
更改您的密码
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,SaFl5cI/G.f

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台U8VP ]$T*EQ^

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

!s:ij0d7Zx[0
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台P+W^sF/wNOp]*Jn

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台x4xZ(Ys(?#}kn


ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Xjz-ch R:S+D,L

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

#|&vQj!z2BGN6o$s0

关闭 [x]

C6O d T o.B"_3Ln$Q0

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

xfo+wrQE&a0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台g4VV-X/|%a

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

5~zS1kJ|Y0

ouRRza_MC{0(长度在 3 至 31 个字符之间)

N)t5Ju2q)c0

单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

,\L%k)I[j0
ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台4ra?v"} L;z]

9dS*X ~ @&P#ZO0

为本文评分ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#Nm$k ^ L#]D


TAG: 系统 源代码

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

hsy75

hsy75

兴趣面前永远没有困难

用户菜单

我的栏目

日历

« 2019-01-19  
  12345
6789101112
13141516171819
20212223242526
2728293031  

我的存档

数据统计

RSS订阅

Open Toolbar