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


105

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

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

我做错了什么?


6
这不是编译器错误,而是链接器错误。您需要链接到Boost.System库。
ildjarn 2012年

Answers:


160

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

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


3
我正在使用g ++ Makefile进行编译。通常在哪里放置这样的标志?
user1049697 2012年

2
编译器/链接器命令行的组装方式因情况而异。为什么不将Makefile(或其相关部分)粘贴到您的问题中?这样,您可以获得适用于特定情况的答案。
hc_ 2012年

7
好吧,我编辑Makefile.am和补充-lboost_system,所以它是这样的:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system。它并没有帮助...
user1049697 2012年

1
还是同样的错误?你autoreconf后来跑了吗?此外,这篇文章这一个可以帮你自动工具的配置。
hc_ 2012年

2
我在Makefile.am中替换sslsniff_LDFLAGSsslsniff_LDADD它,但没有用。然后,我都保留sslsniff_LDFLAGS并添加了sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp。然后我就可以编译了。感谢您的帮助!
user1049697

62

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

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

正如@AndrewMarshall所注意到的那样,另一种方法是定义BOOST_ERROR_CODE_HEADER_ONLY启用代码的仅标头版本的代码。Boost 不鼓励这样做,因为它可能破坏某些功能。但是,从1.69开始,仅标头似乎已成为默认值,据说已使这个问题过时了。


4
谢谢!!!自从我使用boost 1.41(Centos SL)以来,没有任何帮助,唯一让我放松的是使用-DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
实际上,您可能想要的是-DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
有趣的是,在缺少链接排序问题的情况下,较少引用system_category()等的新Boost 1.66行为可能会引入的链接问题。例如,请参见github.com/PointCloudLibrary/pcl/pull/2236
pixelbeat

3
如果您使用CMake,只需添加'add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)'
nickolay

1
Boost 1.68对我有用的唯一解决方法是定义BOOST_ERROR_CODE_HEADER_ONLY
sakra

17

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

-DBOOST_ERROR_CODE_HEADER_ONLY

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


1
我最近遇到了这个问题。除此以外,其他任何方法均无效。我想知道马克·格里斯(Marc Glisse)的回答是否仍然不鼓励这种做法。
John Z. Li

1
引用“ Boost.System现在仅是标头。仍为兼容性而构建了存根库,但不再需要链接到它。”
John Z. Li

16

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

您必须添加-lboost_system链接器标志,该标志指示链接器必须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

5
-l和库名称之间的空格不正确。你应该使用-lboost_system
portforwardpodcast

1
我发现centos不在乎-l的位置,但是ubuntu确实在最后。
ask_io 2015年

7

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

find_package(Boost COMPONENTS system ...)

并不是

find_package(boost COMPONENTS system ...)

有些人可能为此失去了时间...


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

解决方案是使用system-lib的debug-version:

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

但为什么?


1
可能是某个地方定义了一些调试标志,所以您在debug中内置了其他库,或者g ++正在生成debug obj?
noonex 2015年

4

当我遇到这个问题时,原因是库的排序。为了解决这个问题,我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并带有一个简单的计时器示例。


1
这也是我的问题。我通过CMake包含了它,无论出于何种原因,都假定在FindBoost脚本中确定了依赖性和顺序。但是,实际上,我的问题始终是使用共享库,并且从未关注过,然后转向静态库并出现构建错误。哎呀。
安东尼

这也为我修复了该问题...在此解决方案之前,唯一有效的方法是定义BOOST_ERROR_CODE_HEADER_ONLY。在Ubuntu 18.04上,使用cmake提高1.68。我的解决方法:target_link_libraries(executable pthread ssl crypto boost_system)
路易斯


1

...并且如果您想静态链接主链接,请在Jamfile中将以下内容添加到需求中:

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

也许还有:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.