编译时未定义对boost::system::system_category()的引用
undefined reference to boost::system::system_category() when compiling
我正试图在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++
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- C++ Boost:在Windows中对boost::system::generic_category()的未定义引用
- 对"boost::system::system_category()"的未定义引用
- 对 boost::system 的未定义引用
- 未定义对"boost::system::generic_category()"的引用
- C++ Boost:未定义的对 boost::system::generic_category() 的引用
- 使用引用的项目时 C# 项目崩溃C++"System.IO.FileNotFoundException"
- 编译时未定义对boost::system::system_category()的引用
- 未定义对"boost::system::generic_category()"的引用?
- C ++并且无法编译 - 未定义对'boost::system::generic_category()的引用
- DLPon失败:找不到"/system/lib/libdl.so"引用的符号"__cxa_finalize"
- 对boost::system::generic的另一个未定义引用
- 对'boost::system::system_category()'的未定义引用
- System::对C++char*参数的字符串引用