我正在尝试在Ubuntu 11.10上编译一个使用Boost库的程序。我安装了Ubuntu Repository中的1.46-dev Boost库,但编译程序时出错。
undefined reference to boost::system::system_category()
我做错了什么?
答案 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++