编译时未定义对boost::system::system_category()的引用

undefined reference to boost::system::system_category() when compiling

本文关键字:system 引用 category boost 编译 未定义      更新时间:2023-10-16

我正试图在Ubuntu 11.10上编译一个使用Boost库的程序。我安装了Ubuntu存储库中的1.46-dev Boost库,但在编译程序时出错。

undefined reference to boost::system::system_category()

我做错了什么?

您正在使用的boost库取决于boostrongystem库。(并非所有人都这么做。)

假设您使用gcc,请尝试将-lboost_system添加到编译器命令行,以便链接到该库。

与定义缺失符号(-lboost_system)的库链接是显而易见的解决方案,但在Boost.System的特定情况下,原始设计中的一个错误特性使其不必要地使用boost::system::generic_category()boost::system::system_category()。使用标志-DBOOST_SYSTEM_NO_DEPRECATED进行编译会禁用该代码,并允许许多程序在不需要-lboost_system的情况下进行编译(当然,如果明确使用库的某些功能,则仍然需要该链接)。

从Boost 1.66和这个提交开始,这个行为现在是默认的,所以希望越来越少的用户需要这个答案。

正如@AndrewMarshall所注意到的,另一种选择是定义BOOST_ERROR_CODE_HEADER_ONLY,它启用代码的仅头部版本。Boost不鼓励这样做,因为它可能会破坏一些功能。然而,自1.69以来,header似乎只是默认的,据说这让这个问题过时了。

对于那些不需要整个shebang的人来说,另一个解决方法是:使用开关

-DBOOST_ERROR_CODE_HEADER_ONLY

如果使用CMake,则为add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

以上错误是链接器错误。。。链接器是一种程序,它接受编译器生成的一个或多个对象,并将它们组合成一个可执行程序。

您必须将-lboost_system添加到链接器标志中,该标志指示链接器必须在库libboost_system.so中查找类似boost::system::system_category()的符号。

如果您有main.cpp,请选择:

g++ main.cpp -o main -lboost_system

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

使用CMAKE和find_package时,请确保它是:

find_package(Boost COMPONENTS system ...)

而不是

find_package(boost COMPONENTS system ...)

有些人可能为此损失了几个小时。。。

我遇到了同样的问题:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj 
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D:/bfs_ENTW_deb/obj/test/main-filesystem.obj:min-filesystem.cpp:(.text+0x54):未定义对`boost::system::generic_category()的引用

解决方案是使用调试版本的系统库:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj 
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

但为什么呢?

当我遇到这个问题时,原因是库的排序。为了修复它,我把libboost_system放在最后:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib 
    -lboost_timer-mgw53-mt-1_61 
    -lboost_chrono-mgw53-mt-1_61 
    -lboost_system-mgw53-mt-1_61

这是在mingw上的gcc 5.3和boost 1.61.0上的一个简单计时器示例。

在我的情况下,添加-lboost_system是不够的,它仍然无法在我的自定义构建环境中找到它。我不得不使用"摆脱"的建议;gcc-/usr/bin/ld:未找到警告库"并将我的./configure命令更改为:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

更多细节参见Boost 1.51:";错误:无法链接到boost_thread"

。。。如果你想静态链接你的main,在你的Jamfile中添加以下内容到需求中:

<link>static
<library>/boost/system//boost_system

也许还有:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++