Связывание проблем с общими объектами в Linux (с помощью простого так в консольном приложении)

У меня есть общий объект (abc.so), который я создал после связывания его с кучей файлов libs (.a и.so). Теперь этот abc.so просто выставляет 3 функции.

Сейчас я пишу консольное приложение на Linux, которое использует этот abc.so для вызова этих функций. Когда я пытаюсь построить это приложение,

Я получаю кучу ошибок "Неопределенная ссылка на" xxxxxxx ". Теперь эти ссылки приводят к тому, что abc.so зависит от abd, и даже углубляются в ссылки внутри них.

Я не уверен, почему это происходит. Должен ли он загружать их во время выполнения? По крайней мере, это то, что я думал (грядет фон windows/MSVC).

Пожалуйста, помогите мне в этом.

2 ответа

Вы должны связать свое приложение со ссылкой на все общие объекты (.so), от которых зависит ваше приложение. Вам не нужно связываться со статически включенными архивами (.a)

Если abc.so построен с использованием a.so, b.so и ca, вам придется связать ваше приложение с abc.so, a.so и b.so.

Когда ваше приложение правильно связано, вы также должны быть уверены, что оно может найти общие объекты. Вы можете использовать 'ldd myapp', чтобы вывести список общих объектов.

my2c

Вам все еще нужно связать файл библиотеки, но вы сообщаете компоновщику, что символы должны загружаться во время выполнения из общей библиотеки, связываясь с файлом.so. Как выглядит ваша командная строка компоновщика?

Также проверьте свой LD_LIBRARY_PATH. Если ваша общая библиотека не находится в одном из стандартных мест, например /usr/lib, тогда вам нужно сделать:

export LD_LIBRARY_PATH=pathToDirWithYourSharedLibrary:$LD_LIBRARY_PATH

Если вы этого не сделаете, вы получите ошибки во время выполнения.

Другие вопросы по тегам