C ++ с использованием функций из общей библиотеки - PullRequest
0 голосов
/ 29 сентября 2018

У меня следующая проблема:

У меня есть два отдельных проекта c ++, и я хочу использовать определенные функции из одного из них в другом.Я собираю с использованием g ++, на Linux.

Я решил сделать это, создав из проекта общую библиотеку для использования функций.Я добавил -fPIC к флагам компилятора в Makefile, а затем создал общую библиотеку следующим образом:

g++ -shared -Wl,-soname,libmyproject.so.1 -o libmyproject.so a.o b.o c.o -lc

Затем я просто скопировал файл .so и файлы заголовков в (родительский) каталог новогопроект и добавил следующее в свой Makefile:

В LIBS:

-L/../external_proj/libmyproject.so

В CXXFLAGS:

-I/../external_proj

Затем я # включаю соответствующий заголовочный файл в место назначениякод проекта и попробуйте вызвать определенные функции из исходного проекта.Однако, когда я компилирую целевой проект, я получаю сообщение об ошибке «неопределенная ссылка» для импортированной функции.

Мой вопрос: есть ли что-то, чего мне не хватает в этой настройке?Возможно, что-то нужно добавить в заголовки в исходном проекте, чтобы экспортировать функции, которые я хочу использовать?

Должен заметить, это первый раз, когда я пытался использовать разделяемую библиотеку таким образом.Благодарю.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Параметр -L указывает только каталог , в котором компоновщик будет искать библиотеки для связи.Затем вам нужно будет использовать опцию -l, чтобы указать базовое имя разделяемой библиотеки (без префикса "lib" и суффикса ".so").

Но даже этого вряд ли будет достаточно,Загрузчик времени выполнения должен найти разделяемую библиотеку, когда вы пытаетесь ее запустить.-L и -l будет достаточно для успешной компоновки, но загрузчик среды выполнения ищет только /usr/lib(64)? и несколько других мест по умолчанию.Он НЕ выполняет поиск в текущем каталоге, а двоичный файл ELF записывает только имена общих библиотек, которые должны быть загружены, а не их полные пути.Вы должны явно записывать любые дополнительные каталоги для поиска любых общих библиотек, что является опцией -rpath.

Чтобы завершить работу, вам также нужно будет передать -rpath компоновщику, но g ++ не делает этого.Для поддержки этого каталога опций вам нужно будет использовать -W.

Полный набор параметров, которые вам, вероятно, понадобятся:

-L/../external_proj -lmyproject -Wl,-rpath -Wl,`cd ../external_proj && pwd`

Для получения дополнительной информации см. документацию gcc.опция -W.

Абсолютные имена путей должны использоваться с -rpath, поэтому необходимо получить полный путь к каталогу, в котором находится общая библиотека.

0 голосов
/ 29 сентября 2018

Флаг -L предназначен для добавления пути для поиска в библиотеках. -l (строчный L) предназначен для связи с библиотекой в ​​пути поиска.

Или вы можете пропустить флаги и связаться с библиотекой напрямую, почти так же, как сейчас (но без опции -L).


Если вы используете опцию -l, то запомните, чтодля файла libname.so вы используете только name в качестве имени библиотеки.Как в -lname.Компоновщик будет искать правильные файлы с добавленным префиксом и суффиксом.


И, наконец, важное примечание о путях, используемых при компоновке: если вы используете -L и -l для связи сразделяемая библиотека, это только компоновщик, который найдет библиотеку.Загрузчик ОС ОС не сможет увидеть используемый путь и не найдет библиотеку, если она находится в нестандартном месте.Для этого вы также должны установить путь выполнения , используя специальный параметр компоновщика -rpath.

К сожалению, программа внешнего интерфейса GCC g++ не распознает эту опцию, вы должны использовать-Wl, чтобы сказать g++, чтобы передать опцию фактическому компоновщику.Как и в -Wl,-rpath,/path/to/libraries.

Подводя итог, можно использовать следующие варианты:

  • Связь непосредственно с библиотекой: g++ your_source.cpp ../external_proj/libmyproject.so
  • Использование-L и -l параметры: g++ your_source.cpp -L../external_proj -lmyproject
  • Чтобы установить путь компоновщика во время выполнения: g++ your_source.cpp -L../external_proj -lmyproject -Wl,-rpath,../external_proj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...