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

我正在尝试使用Boost库在Ubuntu 11.10上编译一个程序。 我安装了Ubuntu Repository的1.46-dev Boost库,但在编译程序时出现错误。

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

我做错了什么?

您使用的boost库取决于boost_system库。 (并不是所有人都这么做)

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

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

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

正如@AndrewMarshall所注意到的,另一种方法是定义BOOST_ERROR_CODE_HEADER_ONLY ,它启用了代码的仅标题版本。 然而,这是由Boost 阻止 ,因为它可以打破一些function。

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

你必须给链接器标志添加'-l boost_system',它向链接器指示它必须在库libboost_system.so查找像boost::system::system_category()libboost_system.so

如果您有main.cpp,则:

 g++ main.cpp -o main -lboost_system 

要么

 g++ -c -o main.o main.cpp g++ main.o -lboost_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:main_filesystem.cpp 🙁 .text + 0x54):对boost :: system :: generic_category()的未定义引用

解决方法是使用system-lib的debugging版本:

 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 

但为什么?

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

 find_package(Boost COMPONENTS system ...) 

并不是

 find_package(boost COMPONENTS system ...) 

有些人可能已经失去了小时

…如果你想连接你的主静态,在你的Jamfile中添加以下要求:

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

也许还有:

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

在我的情况下,添加-lboost_system是不够的,它仍然无法在我的自定义生成环境中find它。 我不得不使用“gcc – / usr / bin / ld:warning lib not found”的build议 ,并将我的./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!

当我有这个问题,原因是图书馆的顺序。 为了解决这个问题,我把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 

这是用gcc 5.3在mingw上,用一个简单的定时器例子来提升1.61.0。