无法链接到共享库
Posted
技术标签:
【中文标题】无法链接到共享库【英文标题】:Cannot link to shared library 【发布时间】:2012-11-22 22:14:00 【问题描述】:我正在尝试编译一个最小的共享库并链接到它,现在已经失败了两个小时。这是所有代码:
// rect.h
class Rect
private:
int width_, height_;
public:
Rect(int width, int height);
int width();
int height();
;
// rect.cpp
#include "rect.h"
Rect::Rect(int width, int height)
:width_(width), height_(height)
int Rect::width() return width_;
int Rect::height() return height_;
// client.cpp
#include "rect.h"
#include <iostream>
int main()
std::cout << Rect(1,2).width();
return 0;
这就是我尝试编译它的方式:
$ g++ -shared -o librect.so rect.cpp
$ g++ -L. -lrect -Wl,-rpath,'.' client.cpp -o client
/tmp/cc0Xe7ms.o: In function `main':
client.cpp:(.text+0x1a): undefined reference to `Rect::Rect(int, int)'
client.cpp:(.text+0x26): undefined reference to `Rect::width()'
collect2: error: ld returned 1 exit status
该库编译得很好,并且 Rect 类可以正确导出:
$ nm -D librect.so
0000000000201028 B __bss_start
w __cxa_finalize
0000000000201028 D _edata
0000000000201030 B _end
0000000000000738 T _fini
w __gmon_start__
00000000000005b8 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
0000000000000714 T _ZN4Rect5widthEv
0000000000000724 T _ZN4Rect6heightEv
00000000000006f0 T _ZN4RectC1Eii
00000000000006f0 T _ZN4RectC2Eii
最奇怪的是,它编译得很好并且可以在我的工作计算机(Kubuntu 12.10 64 位)上正常运行,但无法在我尝试过的任何其他机器上正确链接(总共 4 个,所有 64 位 Ubuntu/Kubuntu 12.04 和 12.10 )
我尝试了我能想到的一切。将verbose选项传递给链接器表明确实找到了librect.so。
有人知道问题出在哪里吗?
【问题讨论】:
所有代码?真的吗?忘记包括可能吗? 在我的 Fedora 17 32bit 和 GCC 4.7.2 上运行良好;也就是说,如果我将 #include "rect.h" 添加到 rect.cpp 的顶部 @LuchianGrigore 我确实忘记了包含,但它在我的代码中。我编辑了这个问题。谢谢 【参考方案1】:图书馆必须在本地翻译单元之后:
g++ -L. -Wl,-rpath,'.' client.cpp -o client -lrect
# ^^^^^^
这与链接器如何查找未解析的符号有关;如果您对此感到好奇,请在互联网上搜索大量信息。
【讨论】:
这太荒谬了!至少在我熟悉这背后的原因之前,我是这么认为的。链接器不能至少给出一个警告,说明它忽略了它的一个参数或其他东西。 @Mitko:这实际上很有意义。在你抱怨之前写你自己的链接器:-)以上是关于无法链接到共享库的主要内容,如果未能解决你的问题,请参考以下文章