我用gcc
和ar
创建了一个静态库libstuff.a
。我在/custom/lib/dir/
中安装了库,在/custom/include/dir/
中安装了头文件。当我试图根据存档编译另一个应用程序时,我遇到了问题。
我尝试编译的应用程序基本上使用gcc -L/custom/lib/dir/ -I/custom/include/dir/ -lstuff
。
当我试图编译时,我在stuff.h
中声明并在stuff.c
中定义的函数出现错误。
main.c:51: undefined reference to `stuff_init'
collect2: error: ld returned 1 exit status
如果我从/custom/lib/dir/
中删除libstuff.a
,编译器会抱怨/usr/bin/ld: cannot find -lstuff
。如果我把它放回去,它不会抱怨。所以它能正确地找到档案。
如果我从main.c
中删除代码#include "stuff.h"
,gcc会抱怨stuff_init
未定义,所以它可以正确地找到标头。
如果我运行nm libstuff.a
,则输出包括0000000000000000 T stuff_init
。因此,函数是在归档文件中定义的。
那么我做错了什么?
您没有显示确切的链接行,但很可能您应该(但不(在对象文件后面列出库:
gcc -o program main.o -L/custom/lib/dir -lstuff
如果库之外有多个对象文件,请将它们全部列在任何库之前。-L
选项可以位于使用给定目录中的库的-llib
选项之前的任何位置。