【问题标题】:error about compiling c++ code with cmake and boost关于使用 cmake 和 boost 编译 c++ 代码的错误
【发布时间】:2012-03-02 04:22:27
【问题描述】:

我正在尝试根据 CMake 的提升来编译 c++ 软件。使用相同的源代码和 CMakeLists.txt 文件,我成功使用了自己的笔记本电脑(带有 boost1.42 的 ubuntu 11),但是我在研究组(顺便说一句)中使用我的工作站(带有 boost 1.41 的 RHEL6.2)收到以下错误消息,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

我不太了解错误消息,也不知道如何修复它。谁能帮帮我?

========================更新======================= ==

感谢您的帮助,上述错误消息已得到修复,但我仍然收到错误消息,表明我的可执行文件和 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()'

.......

我在这里阅读了其他相关帖子,但仍然不知道如何解决我的问题。谢谢!

【问题讨论】:

  • 你能给我们看看 main.cpp 的第 50 行吗?也许还有一些关于这条线的背景?
  • 另外,在第 664 行,您似乎在调用一个不存在的方法。我知道 boost::filesystem v3 破坏了 v2 的许多东西,所以检查被删除的函数。
  • main.cpp 的第50 行中,您正在实例化一个boost::fileystem3::path 对象。您传递给构造函数的第二个参数是什么?
  • 您确定这是 1.41 版吗?因为 v3 只是从 Boost 1.46 开始的默认设置。另一件事是 path::native_file_string 已被弃用并且(我认为)已经有一段时间了。 Boost 是否实际提供不推荐使用的位由#define 控制;也许它在您的两个系统上的定义不同。
  • @wilhelmtell 谢谢。第 50 行是 :' return path(str, boost::filesystem::native); '。问题是由于默认的 Boost 文件系统版本。但是现在我在将可执行文件与 boost 库链接时遇到了一些问题。

标签: c++ boost cmake


【解决方案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 发行版在 boost 打包方面往往有些慢)以及系统提供的版本,那么您可以提示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 树中。

【讨论】:

  • Janitor048,谢谢。我按照你在这里所说的做了,来自 cmake 的消息表明它可以找到提升。但我仍然无法将 boost 与我的可执行文件链接起来。我的cmake版本是2.8。我注意到当我 yum install boost*.x86_64 时,没有 boost-system-devel。这可能是原因吗?非常感谢您的回答。
  • cmake 的消息是:'-- Boost 版本:1.41.0 -- Boost 版本:1.41.0 -- 找到以下 Boost 库:--python --system --thread-mt -- 序列化 -- 文件系统 -- program_options'
  • -- ** Boost 包含:/usr/include -- ** Boost 库:优化;/usr/lib64/libboost_python-mt.so;debug;/usr/lib64/libboost_python-mt。所以;优化;/usr/lib64/libboost_system-mt.so;调试;/usr/lib64/libboost_system-mt.so;优化;/usr/lib64/libboost_thread-mt.so;调试;/usr/lib64/libboost_thread- mt.so;优化;/usr/lib64/libboost_serialization-mt.so;调试;/usr/lib64/libboost_serialization-mt.so;优化;/usr/lib64/libboost_filesystem-mt.so;调试;/usr/lib64/ libboost_filesystem-mt.so;优化;/usr/lib64/libboost_program_options-mt.so;调试;/usr/lib64/libboost_program_options-mt.so '。
  • 我认为您在 find_package 命令中省略了 components 部分,因为您发现了太多组件(您不需要全部,是吗?)。你能编辑你的问题并附加你的 CMakeLists.txt 吗?尤其是执行 find boost 和 target_link_libraries(..) 的部分。重要的是:您现在收到哪个错误消息?显然 boost::system 库已安装并找到,我怀疑头文件(开发包)是否丢失。但我并不真正了解 RedHat 的包装,因此错误消息会有所帮助。
  • @Tao 或许你可以检查/usr/include/boost下是否存在所需的头文件,尤其是如果有一个名为system的文件夹
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多