ubuntu 尝试包含一个库,但不断得到'undefined reference to'消息

wfveoks0  于 2023-04-29  发布在  其他
关注(0)|答案(4)|浏览(212)

我正在尝试使用libtommath库。我在Ubuntu Linux上的项目中使用NetBeans IDE。我已经下载并构建了库,我已经做了一个‘使安装‘把结果。文件到/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环境的问题。有人知道怎么解决吗?

vsdwdz23

vsdwdz231#

这里的技巧是将库放在您正在编译的模块之后。问题是一个参考的东西。链接器按顺序解析引用,因此当库位于正在编译的模块之前时,链接器会感到困惑,认为库中的任何函数都是不需要的。通过将库放在模块之后,链接器解析模块中对库的引用。

mbyulnm0

mbyulnm02#

是,需要在源文件/对象文件之后添加库。此命令将解决问题:

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

xzv2uavs3#

如果转换了.c源文件。cpp(如秒差距),则extern后面需要跟“C”,如

extern "C" void foo();
2ekbmq32

2ekbmq324#

检查路径中缺少的lib

相关问题