【问题标题】:Undefined reference to 'boost::system::generic_category()'?对'boost::system::generic_category()'的未定义引用?
【发布时间】:2013-08-14 13:12:18
【问题描述】:

似乎我无法看到明显的东西。我想为我的项目使用一些 Boost 库功能,并且知道我突然遇到了这些不错的错误:

链接 CXX 可执行 ATFOR CMakeFiles/ATFOR.dir/stdafx.cc.o:在函数__static_initialization_and_destruction_0(int, int)': stdafx.cc:(.text+0x3c): undefined reference toboost::system::generic_category()' stdafx.cc:(.text+0x48): 未定义引用boost::system::generic_category()' stdafx.cc:(.text+0x54): undefined reference toboost::system::system_category()' CMakeFiles/ATFOR.dir/Main.cc.o:在函数__static_initialization_and_destruction_0(int, int)': Main.cc:(.text+0x29d): undefined reference toboost::system::generic_category()' Main.cc:(.text+0x2a9): 未定义引用boost::system::generic_category()' Main.cc:(.text+0x2b5): undefined reference toboost::system::system_category()' collect2:错误:ld 返回 1 个退出状态

在这里您可以找到我的 CMakeLists.txt、标题和主文件:http://pastie.org/8231509
如您所见,我尝试了很多使用 CMakeLists 的方法,并且我很确定我拥有我的项目所需的所有标题。无论如何,我以前从来没有遇到过这样的错误,我真的很感谢任何关于这里出了什么问题的建议/解决方案,因为我现在没有任何想法。提前谢谢。

【问题讨论】:

    标签: c++ boost cmake


    【解决方案1】:

    您必须显式添加系统库才能将其链接到您的程序中

    find_package(Boost REQUIRED COMPONENTS system)
    #                                      ^^^^^^ this :)
    

    对于单独构建的其他 Boost 库(正则表达式、线程等)也必须这样做 (see here)。

    【讨论】:

    • Cmake 说它找到了文件系统、系统的库......但是当我“制作”时仍然存在链接错误,我安装了 libboost-1.53​​.0-all-dev,所以我应该拥有我需要的一切。我需要包含 boost::system 的标题吗?没找到
    【解决方案2】:

    链接阶段缺少“系统”库。我的配置如下,它修复了错误:

    find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
    
    include_directories(... ${Boost_INCLUDE_DIRS})
    
    link_directories(... ${Boost_LIBRARY_DIRS})
    
    target_link_libraries(... ${Boost_LIBRARIES})
    

    请注意,仅使用

    find_package(Boost 1.55.0 REQUIRED)
    

    不起作用,因为 ${Boost_LIBRARIES} 届时将不可用。

    【讨论】:

    • 超级有帮助。谢谢。 +1。就我而言,我只需要写find_package(Boost REQUIRED system)。我(还)不需要文件系统。
    • 虽然这个问题与我的问题无关,但我决定仔细阅读这里的答案,你的回答让我意识到我需要filesystem,这最终解决了我的问题。谢谢你。 +1。
    【解决方案3】:

    好的,对于那些感兴趣的人,Mark Garcia 的回答是一个很好的选择,但这里更重要的是你需要明确地链接你想要从 boost 中获得的库,比如

    TARGET_LINK_LIBRARIES(ATFOR ${OpenCV_LIBS} curl ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})

    我尝试和阅读的所有其他选项都对我不起作用,不知道为什么,但我希望这对某人有所帮助。

    【讨论】:

      【解决方案4】:

      检查您的 boost 库的构建是否正确(gccmsvc...)。当我尝试将使用mingw 的项目与为msvc 构建的库链接时出现此错误。如果不同,请尝试为您在项目中使用的平台构建它。

      我第一次使用 Boost 时,我使用默认参数构建了它,从而生成了为 msvc 构建的库,即使我在我的项目中使用了 mingw。 但是 CMake 确实找到了头文件和库,并且在我开始使用库功能和编译之前一切似乎都很好,这导致了 OP 提到的错误。

      重建提升到toolset=gcc 解决了它(我使用的是 Windows,CMake + MinGW)。

      【讨论】: