2015-12-01 2 views
1

Я пытаюсь скомпилировать мой проект на C++ в Linux x64 с помощью boost-библиотек 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()' 

Я заметил, что атрибуты.hpp являются точно одним из файлов заголовков форматирования сопрограмм. И я попробовал с nm, чтобы увеличить библиотеки coroutine, и это, кажется, не проблема.

nm /usr/local/lib/libboost_coroutine.a | grep "default_size" 
0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv 

Я искал возможные причины этой ошибки, и большинство из них касалось порядка флажков компоновщика. И в этом случае rpcx.o зависит от boost_coroutine, поэтому это появляется впереди.

Что еще может быть причиной?

+0

Попробуйте подключить 'libboost_thread' после libboost_coroutine. –

+0

Спасибо за ваш комментарий. Я пробовал, но не работал – Han

+0

Если вы можете создать его с помощью scons, включите подробный вывод отладки с использованием 'VERBOSE = 1', вы должны увидеть команды, которые используются для создания вашего приложения. –

ответ

2

После нескольких часов работы я наконец решил это.

Это, как оказалось, старый boost (v1.55) lib, все еще существующий, который имеет статические библиотеки с тем же именем моей установленной вручную библиотеки boost (v1.57). Компилятор нашел v1.55 статические библиотеки перед v1.57, поэтому он использовал эти библиотеки для связывания. Однако в старой версии функция boost::coroutines::stack_traits::default_size() по-прежнему не введена, что делает компоновщик не в состоянии найти правильное расположение этой функции и возвращает ссылку «undefind reference».

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

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

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

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

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

Надеюсь, это может помочь.

Смежные вопросы