GCC和ld找不到导出的符号......但它们就在那里

时间:2008-10-19 13:51:35

标签: c++ linux g++ shared-libraries

我有一个C ++库和一个C ++应用程序,试图使用从库中导出的函数和类。库构建正常,应用程序编译但无法链接。我得到的错误遵循以下形式:

  

app-source-file.cpp :(。text + 0x2fdb):对`lib-namespace :: GetStatusStr(int)'的未定义引用

链接器似乎可以很好地解决库中的类,但是自由函数和导出的数据(如余弦查找表)总是会导致上述错误。

我使用的是Ubuntu 8.04(Hardy),它是最新的Ubuntu软件包。

链接库的命令是(删除了其他库):

g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so

链接应用程序的命令是(删除了其他库):

g++ -fPIC -Wall -O3  -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question

最后,看来(尽我所知)有问题的符号正在正确导出:

nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi

2 个答案:

答案 0 :(得分:8)

在nm输出中_ZN3lib-namespace12GetStatusStrEi之前的U显示库中的符号未定义

可能它是在错误的命名空间中定义的:它看起来像是在lib-namepace中调用它,但你可能在另一个中定义它。

答案 1 :(得分:2)

已经有一段时间了,但是如果你用-l选项指定一个lib,那么你不能跳过lib前缀吗?

(我将名称从“lib-in-question.so”更改为“libfoobar.so”,以便于阅读以下示例)

g++ -fPIC -Wall -O3  -L~/project/lib/release -lfoobar

g++ -fPIC -Wall -O3  ~/project/lib/release/libfoobar.so