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

use*_*697 102 c++ boost

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

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

我做错了什么?

hc_*_*hc_ 158

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

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

  • 好的,我编辑了Makefile.am并添加了`-lboost_system`,所以看起来像这样:`sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system`.它虽然没有帮助...... (7认同)
  • 我正在使用 g++ Makefile 进行编译。人们通常在哪里放置这样的标志? (3认同)
  • 编译器/链接器命令行的组装方式因情况而异。为什么不将Makefile(或其相关部分)粘贴到您的问题中?这样,您可以获得适用于您特定情况的答案。 (2认同)
  • 我在Makefile.am中用`sslsniff_LDADD`替换了`sslsniff_LDFLAGS`,但是没有用.然后我保留了两个`sslsniff_LDFLAGS`并添加了`sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp`.然后我就能编译了.感谢您的帮助! (2认同)

Mar*_*sse 59

与定义缺失符号(-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 不鼓励这样做,因为它可能会破坏某些功能.

  • 实际上你可能想要的是-DBOOST_ERROR_CODE_HEADER_ONLY (5认同)
  • 谢谢!!!没有任何帮助,因为我使用boost 1.41(Centos SL)唯一让我解脱的是使用-DBOOST_SYSTEM_NO_DEPRECATED (4认同)
  • 这应该是IMO接受的答案. (2认同)
  • 有趣的是,新的 Boost 1.66 行为对 system_category() 等的 _less_ 引用可能会在存在链接排序问题的情况下引入 _new_ 链接问题。例如,参见 https://github.com/PointCloudLibrary/pcl/pull/2236 (2认同)
  • 如果您使用CMake,只需添加'add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)' (2认同)
  • 在 Boost 1.68 中唯一对我有用的修复是定义 `BOOST_ERROR_CODE_HEADER_ONLY`。 (2认同)

Vad*_*man 17

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

-DBOOST_ERROR_CODE_HEADER_ONLY.

如果你使用CMake,那就是add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).

  • 我最近遇到了这个问题。除了这个之外,没有任何东西有效。我想知道 Marc Glisse 的回答中提到的 boost 是否仍然会阻碍这一点。 (2认同)
  • quote “Boost.System 现在仅包含头文件。仍然构建存根库以实现兼容性,但不再需要链接到它。” (2认同)

use*_*604 16

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

您必须将'-l boost_system'添加到链接器标志,这将向链接器指示它必须查找boost::system::system_category()库中的符号libboost_system.so

如果你有main.cpp,可以:

g++ main.cpp -o main -lboost_system
Run Code Online (Sandbox Code Playgroud)

要么

g++ -c -o main.o main.cpp
g++ main.o -lboost_system
Run Code Online (Sandbox Code Playgroud)

  • -l和库名称之间的空格不正确.你应该使用-lboost_system (5认同)

Kri*_*lex 7

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

find_package(Boost COMPONENTS system ...)
Run Code Online (Sandbox Code Playgroud)

并不是

find_package(boost COMPONENTS system ...)
Run Code Online (Sandbox Code Playgroud)

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


小智 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但为什么?