2012-05-02 45 views
2

我已经建立了我lib.a文件与几个未定义参考我自己的图书馆

gcc -c file.c -o file.o 

然后

ar sr lib/libtest.a file1.o file2.o file3.o 

ar -t lib/libtest.a 
file1.o 
file2.o 
file3.o 

证实,但是当我尝试编译测试应用

gcc lib/libtest.a test.c -o test 

我在功能main未定义参考:与图书馆 从file1.o,file2.o使用的功能,file3.o

+0

请参阅[GCC链接选项](http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)。 – hmjd

回答

6

订购事宜 - 尝试:

gcc test.c -o test lib/libtest.a 

基本上,链接器读取当它在输入文件列表中遇到它时(这可能不是如何工作的,但我认为它按照经验法则很好),并且将解决任何尚未定义的引用剩余。当它移动到下一个输入时,它将不会再次查找该库,以查找任何新的未解决的引用。 (注意:有一些链接器选项可以改变这种行为,但它们似乎很少使用,可能有它们自己的缺点,所以我在这里不讨论它们,这种问题通常可以通过解决重新排序链接器的输入文件列表)。

+1

+1。请注意,这只是静态库的一个问题,因为ld会选择归档文件中的哪些对象文件进行链接。有' - 整个档案'这可能是你提到的那些奇特的选项之一,但又不常见也不理想(因为你可能会连接一个潜在的大块)。但是,如果将其包含在库代码本身中(即从多个.a's生成.so),这将非常有用。 –