Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Ошибка неопределенного символа g++ при использовании общей библиотеки

Автор вопроса: CommunityОтветов: 1

Символ находится в файле. Я проверил это с помощью nm & grep, но все еще получаю ошибку неопределенного символа при запуске скомпилированного приложения. Другие символы в общей библиотеке работают нормально. Файл заголовка объявляет его как внешний и не находится в условном блоке препроцессора. Я новичок в c/c++, поэтому любой опыт с чем-то подобным будет оценен.

В StackOverflow есть масса связанных вопросов, но все перечисляют исходные файлы и заголовки, которые ничего не значат для фактического контекста вопроса. Это общий вопрос программирования: почему g++ не может связать символ с моим скомпилированным приложением? Определение заголовка прошло проверку, символ находится в общей библиотеке, а другие символы работают правильно.

  • Без примера вам трудно помочь. Используете ли вы аргумент -lLIB_NAME при вызове g++? mfontanini 01.04.2012
  • Пожалуйста, добавьте соответствующие выходные строки из nm к вашему вопросу. Oliver Charlesworth 01.04.2012
  • Если символ не найден во время runtime, это не имеет отношения к g++. Используйте ldd, чтобы узнать, с какой разделяемой библиотекой на самом деле пытается связать приложение при запуске. Это то место, которое вы ожидаете? Troubadour 01.04.2012
  • @Трубадур, лдд! Прохладный! Да, это ссылка на версию системы, а не на версию разработки, которая не имеет символа. Я использую eclipse, и я сказал ему использовать путь local/lib в настройках сборки. Я не понимаю. вот команда из автоматически сгенерированного make-файла. g++ -L/usr/local/lib -o "smash" ./src/smash.o ./src/smash_init.o -lnspr4 -lmozjs185 Почему он все еще загружает библиотеку в /usr/lib? 01.04.2012
  • Это библиотека C или C++? Вы проверили с помощью nm -C, что библиотека содержит искаженный символ C++? Basile Starynkevitch 01.04.2012
  • @BasileStarynkevitch Это C++. Как мне помог Troubadour, в моей системе есть другая версия библиотеки, которая загружается во время выполнения. 01.04.2012

c++linuxg++

Ответы

Ответ 1 · Troubadour

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

Ваши настройки сборки в порядке, но они не влияют на то, что происходит во время выполнения. Есть способы "запечь" пути в исполняемый файл во время сборки, если вы действительно этого хотите. См. справочную страницу для ld.so, чтобы узнать, как он ищет библиотеки.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы