我正在尝试根据CMake的boost来编译c ++软件。使用相同的源代码和CMakeLists.txt文件,我成功使用自己的笔记本电脑(带有boost1.42的ubuntu 11),但是我的工作站(RHEL6.2,带有增强1.41)在研究组中得到以下错误消息(btw ,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 ======================= ==
由于您的帮助,上述错误消息已得到修复,但我仍然收到错误消息,指出我的可执行文件和boost库之间的链接失败。我确实通过'target_link_libraries(vvv_main vvv $ {Boost_LIBRARIES})在CMakeLists.txt中链接了它。错误消息如下:
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()'
.......
我在这里阅读了其他相关帖子,但仍然不知道如何解决我的问题。谢谢!
答案 0 :(得分:1)
我建议您使用CMake的find_package
例程和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})
应该做的伎俩。如果只有较旧版本的boost可用,则指定版本(此处为1.41)会产生CMake。指定组件(组件=不是标题的boost库)会使CMake抱怨如果这些组件不可用,并自动将它们添加到变量Boost_LIBRARIES中。 Message语句不是必需的,但我希望得到一些反馈......
如果您想手动下载并安装最新版本的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
树中。