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

问题描述:

我有一个C++库和一个C++应用程序,试图使用从库中导出的函数和类。该库建立良好,应用程序编译但无法链接。这些错误我得到遵循这种形式:GCC和ld找不到导出的符号......但他们在那里!

APP-源file.cpp :(文字+ 0x2fdb):未定义的引用`LIB命名空间:: GetStatusStr(INT)”

类在库中好像被链接器解析得很好,但自由函数和导出的数据(如余弦查找表)总是会导致上述错误。

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

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

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 
+0

你是不是给我们足够的信息;因此你会得到很多错误的猜测。你可能只是犯了一个简单的错误。简化将错误重现到最低限度所需的代码。然后将它与实际的shell命令以及它们的输出一起发布,从而导致错误。 – ejgottl 2008-10-19 14:56:28

+0

“lib-namespace”不是合法的命名空间,实际的符号名称是什么? – 2008-10-20 00:56:44

U是nm输出中的前_ZN3lib-namespace12GetStatusStrEi显示该库中的符号为undefined

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

+0

关于如何获得定义符号的任何建议?它所在的cpp文件正在编译! – Clay 2008-10-19 15:52:52

这已经有一段时间了,但是如果你用-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