Сбой соединения в статической библиотеке, но соединение с общей библиотекой успешно - PullRequest
0 голосов
/ 28 декабря 2018

Я могу построить свое приложение на основе общей библиотеки, но я получаю неразрешенные ошибки символов при связывании его со статической версией той же библиотеки:

Я могу построить свое приложение следующим образом:

g++ -lutils application.cpp -o application.exe

Приведенные выше ссылки на команды в общей версии библиотеки utils.

Я пытаюсь связать статическую версию библиотеки следующим образом:

g++ -l:utils.a application.cpp -o application.exe

Обараз я использую

export LD_LIBRARY_PATH=path/to/utils:$LD_LIBRARY_PATH

, чтобы сообщить g ++, где находится utils.a.

Неразрешенный символ, сообщаемый ld, присутствует в выходных данных nm:

nm --defined-only path/to/utils.a

и помечен буквой «Т» (это означает, что это из раздела кода).

Я пытаюсь выяснить, в чем может быть причина проблемы.

Правильно ли использовать LD_LIBRARY_PATH, чтобы указать, где искать utils.a?

Какая точная команда для проверки того, что статическая библиотека определяет (разрешает) символ?Достаточно ли команды

nm --defined-only path/to/utils.a

или я должен использовать какие-либо дополнительные параметры, например

nm --defined-only --demangle path/to/utils.a

например?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Правильно ли использовать LD_LIBRARY_PATH, чтобы указать, где искать utils.a?

  1. Как упоминалось @ user10605163, LD_LIBRARY_PATH не для поиска пути к статической библиотеке ввремя компиляции и компоновки.Это переменная среды, используемая в некоторых дистрибутивах Linux для поиска общих библиотек во время выполнения.Пожалуйста, найдите больше документации здесь Это полезно для среды сборки и тестирования, но не является рекомендуемым способом связывания в производственных системах.

Какая точная команда для проверки этогостатическая библиотека определяет (разрешает) символ?Является ли команда nm --defined-only path / to / utils.a

Да, это правильно.Однако, основываясь на предоставленной информации, эта ошибка, скорее всего, не ошибка с символами, отсутствующими в утилитах (как это работает с общей библиотекой), но с связью.

См. Документация по GNU. Опции ссылок GCC Отрывок:

-l библиотека: Поиск библиотеки с именем библиотека при связывании.Компоновщик ищет стандартный список каталогов для библиотеки.В число найденных каталогов входят несколько стандартных системных каталогов плюс любые, которые вы указываете с помощью -L.

Кроме того, с опцией -l link вам необходимо указать имя библиотеки (без 'lib' и расширения) или полное имя файла.-lutils или -llibutils.a Вы также можете указать прямой полный путь только здесь, если требуется.

0 голосов
/ 30 декабря 2018

Просто опции -static должно хватить для компилятора.В случае, если только одна библиотека должна быть статической, тогда -static- и имя lib - это короткое имя, а не имя файла.

...