Ошибка компоновки "неопределенная ссылка" о повышении статической библиотеки во время компиляции
Я пытаюсь скомпилировать мой проект C++ на Linux x64 с библиотеками повышения 1.57.
Этот проект собран с помощью scons, и я успешно скомпилировал его на моем Arch Linux, но на этот раз не получилось на машине с Ubuntu.
я добавил -lboost_coroutine
флаг для ссылки, но ошибка "неопределенная ссылка" все еще существует.
/usr/bin/g++ -o build/gcc.release/app -pthread -g
build/gcc.release/src/han/unity/rpcx.o
-lpthread -lz -lboost_coroutine -lboost_context -lboost_date_time
build/gcc.release/src/han/unity/rpcx.o: In function `attributes':
/usr/local/include/boost/coroutine/attributes.hpp:31: undefined reference
to `boost::coroutines::stack_traits::default_size()'
Я заметил, что attribute.hpp - это точно один из заголовочных файлов boost сопрограммы. И я попытался с помощью nm повысить уровень сопрограмм, и это не проблема.
nm /usr/local/lib/libboost_coroutine.a | grep "default_size"
0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv
Я искал возможные причины этой ошибки, и большинство из них касается порядка флагов компоновщика. И в этом случае rpcx.o зависит от boost_coroutine, так что это появляется впереди.
Какие еще могут быть причины?
1 ответ
После нескольких часов усилий я наконец решил это.
Оказывается, это старая библиотека boost (v1.55), которая до сих пор существует, в которой есть статические библиотеки с тем же именем, что и моя библиотека boost, установленная вручную (v1.57). Линкер нашел статические библиотеки v1.55 до версии 1.57, поэтому он использовал эти библиотеки для линковки. Однако в старой версии функция boost::coroutines::stack_traits::default_size()
все еще не введен, что делает компоновщик не может найти правильное местоположение этой функции, и возвращает "неопределенную ссылку".
Для тех, кто случайно находит эти вопросы из-за поиска ошибок "неопределенная ссылка" во время компиляции, я сделал несколько шагов по отладке такого рода проблем и написал здесь для вашей информации.
Проверьте, существует ли библиотека, с которой вы связаны
/usr/lib/
или же/usr/local/lib/
Если нет, попробуйте установить их в первую очередь.Проверьте, правильно ли вы добавили флаг ссылки для указанных вами библиотек. Например, если вы используете библиотеку boost_coroutine, обязательно добавьте
-lboost_coroutine
во время ссылки.Проверьте правильность порядка привязки флагов (для gcc). Это может быть причиной большинства случаев. Не забудьте поставить B перед A, если B зависит от A.
Проверьте, существуют ли разные версии для одних и тех же библиотек.
Я надеюсь, что это может как-то помочь.