我有一个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
输出中_ZN3lib-namespace12GetStatusStrEi之前的U显示该符号在库中未定义。
也许它在错误的命名空间中定义:看起来你在 lib-namepace 中调用它,但你可能在另一个命名空间中定义它。
有一段时间了,但是如果您使用 -l 选项指定一个库,那么您没有跳过 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