ошибка компиляции кода c ++ с помощью cmake и boost - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь скомпилировать программное обеспечение c ++ в зависимости от повышения с CMake.С тем же исходным кодом и файлами CMakeLists.txt у меня получилось с моим ноутбуком (ubuntu 11 с boost1.42), но я получаю следующее сообщение об ошибке с моей рабочей станцией (RHEL6.2 с boost 1.41) в исследовательской группе (кстати), boost1.41 должно быть достаточно):

main/main.cpp: In function ‘path
make_path(const std::string&)’:
main/main.cpp:50: error: invalid
conversion from ‘bool (*)(const std::string&)’ to ‘void*’
main/main.cpp:50: error:
initializing argument 2 of ‘boost::filesystem3::path::path(const Source&,
typename
boost::enable_if<boost::filesystem3::path_traits::is_pathable<typename
boost::decay<Source>::type>, void>::type*) [with Source =
std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’
main/main.cpp: In function ‘int
main(int, char**)’:
main/main.cpp:664: error: ‘class
path’ has no member named ‘native_file_string’
main/main.cpp:676: error: ‘class
path’ has no member named ‘native_file_string’
make[2]: *** [main/CMakeFiles/vina_main.dir/main.cpp.o] Error 1
make[1]: *** [main/CMakeFiles/vina_main.dir/all] Error 2
make: *** [all] Error 2

Я не совсем понимаю сообщение об ошибке и не знаю, как его исправить.Кто-нибудь может мне помочь?

======================= update =========================

Вышеупомянутое сообщение об ошибке исправлено благодаря вашей помощи, но я все еще получаю сообщение об ошибке, указывающее сбой связи между моим исполняемым файлом и библиотеками наддува.Я связал его в CMakeLists.txt с помощью 'target_link_libraries (vvv_main vvv $ {Boost_LIBRARIES})'.Сообщение об ошибке выглядит так:

CMakeFiles/vvv_main.dir/main.cpp.o: In function              '__static_initialization_and_destruction_0':
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'

.......

Я читаю другие похожие посты здесь, но все еще не знаю, как решить мою проблему.Спасибо!

1 Ответ

1 голос
/ 10 февраля 2012

Я хотел бы предложить, чтобы вы использовали подпрограммы find_package CMake вместе с флагом required и явно указывали нужные вам компоненты. Тогда нет необходимости вручную устанавливать библиотеки.

Для вашего проекта

FIND_PACKAGE(Boost 1.41 COMPONENTS filesystem system REQUIRED)
MESSAGE(STATUS "** Boost Include: ${Boost_INCLUDE_DIR}")
MESSAGE(STATUS "** Boost Libraries: ${Boost_LIBRARIES}")

вместе с

TARGET_LINK_LIBRARIES(your_project ${Boost_LIBRARIES})

должен сделать свое дело. Указание версии (здесь 1.41) делает CMake, если доступна только более старая версия boost. Указание компонентов (компоненты = библиотеки повышения, которые не только для заголовков) заставляет CMake жаловаться, если они недоступны, а также автоматически добавляет их в переменную Boost_LIBRARIES. Заявления в сообщении не обязательны, но мне нравится иметь обратную связь ...

В случае, если вы хотите вручную загрузить и установить новейшую версию boost (что я обычно делаю, поскольку дистрибутивы Linux имеют тенденцию быть несколько медленными в отношении пакетной надстройки) вместе с версией, предоставленной системой, вы можете намекнуть на: Скрипты find_package для перехода в пользовательское местоположение через

SET(BOOST_ROOT "$ENV{HOME}/usr") 

который, конечно, идет перед вызовом find_package (в этом примере boost был бы установлен в префикс $ HOME / usr).

Последнее замечание - у меня иногда возникали проблемы со старыми версиями скрипта FindBoost.cmake (особенно со старыми CMake 2.6), который совершает всю магию при вызове find_package(Boost). Это не должно быть проблемой для Boost 1.41, но если возникают проблемы с поиском (более новых версий) Boost, даже если вы абсолютно уверены, что он установлен правильно, вы можете попробовать более свежую версию FindBoost.cmake. Например, из gitweb он должен быть в дереве Modules.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...