Невозможно связаться с общей библиотекой

Я пытаюсь скомпилировать минимальную разделяемую библиотеку и дать ссылку на нее, и у меня не получается уже два часа. Вот ВСЕ код:

// 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).

Я перепробовал все, что мог придумать. Передача подробного параметра компоновщику показывает, что librect.so действительно успешно найден.

Кто-нибудь знает, в чем проблема?

0

Решение

Библиотеки должны идти после местные переводческие единицы:

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

Это связано с тем, как компоновщик ищет неразрешенные символы; поищите в интернете множество информации об этом, если вам интересно.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector