Ошибка компоновки "неопределенная ссылка" о повышении статической библиотеки во время компиляции

Я пытаюсь скомпилировать мой проект 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() все еще не введен, что делает компоновщик не может найти правильное местоположение этой функции, и возвращает "неопределенную ссылку".

Для тех, кто случайно находит эти вопросы из-за поиска ошибок "неопределенная ссылка" во время компиляции, я сделал несколько шагов по отладке такого рода проблем и написал здесь для вашей информации.

  1. Проверьте, существует ли библиотека, с которой вы связаны /usr/lib/ или же /usr/local/lib/Если нет, попробуйте установить их в первую очередь.

  2. Проверьте, правильно ли вы добавили флаг ссылки для указанных вами библиотек. Например, если вы используете библиотеку boost_coroutine, обязательно добавьте -lboost_coroutine во время ссылки.

  3. Проверьте правильность порядка привязки флагов (для gcc). Это может быть причиной большинства случаев. Не забудьте поставить B перед A, если B зависит от A.

  4. Проверьте, существуют ли разные версии для одних и тех же библиотек.

Я надеюсь, что это может как-то помочь.

Другие вопросы по тегам