试图包含一个库,但总是得到“未定义的引用”消息

我正在尝试使用 libtommath 库。我在 Ubuntu linux 上使用 NetBeans IDE 进行我的项目。我已经下载并构建了库,我已经做了一个“ make install”来放置结果。将文件放入/usr/lib/中,并将。H 文件放入/usr/include

它似乎正在适当地查找这些文件(因为我在安装到/usr 目录之前已经不再收到这些错误了)。

然而,当我创建一个简单的 main 调用 mp _ init (在库中)时,当我尝试创建我的项目时会得到以下错误:

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
mkdir -p dist/Debug/GNU-Linux-x86
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o
build/Debug/GNU-Linux-x86/main.o: In function 'main':
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1

所以,看起来链接器无法在库中找到函数,但它确实存在,所以我不知道是什么原因导致了这种情况。

如果直接键入 gcc 命令并跳过 makefile,我也会得到相同的错误,我还确保静态库也用 gcc 编译。

编辑添加:

如果我直接进行编译,并用-l 或-L 添加库,也会得到同样的错误:

$ gcc -l /usr/lib/libtommath.a main.c
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a
collect2: ld returned 1 exit status


$ gcc -llibtommath.a main.c
/usr/bin/ld: cannot find -llibtommath.a
collect2: ld returned 1 exit status


$ gcc -Llibtommath.a main.c
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status


$ gcc -Llibtommath.a main.c
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

我对这些东西非常生疏,所以我不确定我在这里使用的命令是否正确,在-L 示例中是否找到了库?如果图书馆没有被找到,我到底怎样才能让它找到图书馆呢?它在/usr/lib,我已经试过了。工作目录里的文件等等。有什么环境变量吗?如果是的话,怎么做等等。

我已经尝试了一个完全不同的库(GMP) ,并有完全相同的问题。这肯定是某种 Ubuntu 环境问题?有人知道怎么解决吗?

141302 次浏览

The trick here is to put the library AFTER the module you are compiling. The problem is a reference thing. The linker resolves references in order, so when the library is BEFORE the module being compiled, the linker gets confused and does not think that any of the functions in the library are needed. By putting the library AFTER the module, the references to the library in the module are resolved by the linker.

Yes, It is required to add libraries after the source files/objects files. This command will solve the problem:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath

If the .c source files are converted .cpp (like as in parsec), then the extern needs to be followed by "C" as in

extern "C" void foo();