2013-12-02 3 views
0

Я уже рассмотрел ВСЕ ответы в stackoverflow: никак.Как я могу решить неопределенные ссылки из общей библиотеки?

Я составил общую библиотеку A, которая использует Nite1.3. Так что моя библиотека находится в:

/usr/local/lib/A.so 

Я мой проект B, которые включают А.

Компиляция B, я получаю много неопределенной ссылки на .. как я могу действительно решить эту проблему?

usr/local/lib/A.so: undefined reference to `XnVFlowRouter::XnVFlowRouter(char const*)' 
..... 

ответ

2

Что происходит, что A.so не знает, что конечные символы могут быть получены из libnite.so, поэтому, когда он пытается разрешить символы он не знает, искать в этой библиотеке, и ничто в среде не говорит, что оно загружает эту библиотеку, чтобы искать символы.

Два решения:

(1) Рекомпилированный A.so с явной зависимостью от Nite 1.3, так что при компиляции вы:

g++ -o A.so <files making up A.so> -L<DIRECTORY OF NITE> -Wl,-rpath <DIRECTORY OF NITE> -lnite 

Если libnite.so находится в одном из стандартных мест, то вы должны упустить опции -L и -Wl,-rpath. Это заставит вашу библиотеку явно зависеть от libnite.

(2) ссылка на libnite.so при компиляции B, поэтому ссылка линия должна добавить:

-L<DIRECTORY OF NITE> -Wl,-rpath <DIRECTORY OF NITE> -lnite 

В качестве дополнения, если у вас есть .h файлов, но не имеет соответствующий .a или .so для реализации, тогда вам нужно будет решить эту проблему, прежде чем сможете использовать A.so.

как, например, если libnite.so в /usr/local/lib, то вам необходимо будет добавить:

-L/usr/local/lib -Wl,-rpath /usr/local/lib -lnite 

линии компиляции, так что он знает, где искать библиотеки в компиляции времени (-L опция) , и во время выполнения (опция -Wl,-rpath).

Смежные вопросы