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

时间:2012-03-15 16:18:12

标签: c++ boost

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

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

我做错了什么?

9 个答案:

答案 0 :(得分:152)

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

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

答案 1 :(得分:50)

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

从Boost 1.66和this commit开始,此行为现在是默认行为,因此希望越来越少的用户需要此答案。

正如@AndrewMarshall所注意到的,另一种方法是定义-lboost_system,它启用代码的仅标题版本。但是,这是Boost的discouraged因为它可能会破坏某些功能。

答案 2 :(得分:15)

以上错误是链接器错误......链接器a program that takes one or more objects generated by a compiler and combines them into a single executable program.

您必须将'-l boost_system'添加到链接器标志,这会向链接器指示它必须在库boost::system::system_category()

中查找libboost_system.so之类的符号

如果您有main.cpp,请:

g++ main.cpp -o main -lboost_system

OR

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

答案 3 :(得分:13)

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

-DBOOST_ERROR_CODE_HEADER_ONLY

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

答案 4 :(得分:7)

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

find_package(Boost COMPONENTS system ...)

而不是

find_package(boost COMPONENTS system ...)

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

答案 5 :(得分:6)

我遇到了同样的问题:

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 :(文本+ 0x54):   未定义的引用`boost :: system :: generic_category()

解决方案是使用system-lib的调试版本:

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

但为什么?

答案 6 :(得分:3)

当我遇到这个问题时,原因是库的排序。要修复它,我将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进行调整,使用简单的计时器示例进行增强1.61.0。

答案 7 :(得分:2)

在我的情况下,添加-lboost_system是不够的,它仍然无法在我的自定义构建环境中找到它。我必须使用Get rid of "gcc - /usr/bin/ld: warning lib not found"处的建议并将我的./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 : "error: could not link against boost_thread !"

答案 8 :(得分:1)

...如果您想要静态链接您的主要内容,请在Jamfile中添加以下内容:

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

也许还有:

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