无法链接到共享库

时间:2012-11-22 22:14:00

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

我正在尝试编译一个最小的共享库并链接到它并且已经失败了两个小时了。这是所有代码:

// 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 64bit)但是在我尝试的任何其他机器上都无法正常链接(总共4个,所有64位Ubuntu / Kubuntu 12.04和12.10) )

我尝试了所有我能想到的东西。将详细选项传递给链接器会显示librect.so确实已成功找到。

有没有人知道问题可能是什么?

1 个答案:

答案 0 :(得分:3)

图书馆必须在本地翻译单位后

g++ -L. -Wl,-rpath,'.' client.cpp -o client -lrect
#                                           ^^^^^^

它与链接器如何查找未解析的符号有关;如果你很好奇的话,可以在互联网上搜索大量的信息。