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

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

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


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


Ответы (1)


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

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

person Troubadour    schedule 01.04.2012
comment
Это зависит от того, что вы в конечном итоге пытаетесь сделать. Если вы будете заменять библиотеку в /usr/lib, вам нужно только временно установить LD_LIBRARY_PATH во время разработки. Если вы хотите сохранить версию /usr/lib и всегда использовать версию /usr/local/lib в своем приложении, вы можете рассмотреть возможность запуска вашего приложения с помощью сценария, чтобы вы могли автоматически устанавливать LD_LIBRARY_PATH (и все остальное, что может нужно). - person Troubadour; 01.04.2012
comment
Я придумал решение для своего проекта. Что я сделал, так это полностью переименовал библиотеку, которая будет поставляться с приложением. Это было легко благодаря тому, что имя целевой библиотеки было удобно определено в make-файле. См. Моя запись MDN Wiki для получения дополнительной информации. - person ; 01.04.2012
comment
Спасибо за помощь в отслеживании проблемы! - person ; 01.04.2012
comment
Замена /usr/lib или использование /usr/local/lib может привести к поломке других приложений. Я не допущу, чтобы мое приложение было грубым в качестве гостя в хост-системе. - person ; 01.04.2012
comment
Тем не менее, я уверен, что это достаточно общие вопросы и ответы, чтобы помочь другим бедолагам, которые могут столкнуться с подобной проблемой. - person ; 01.04.2012