在编译时未定义对boost :: system :: system_category()的引用
我正在尝试使用Boost库在Ubuntu 11.10上编译一个程序。 我安装了Ubuntu Repository的1.46-dev Boost库,但在编译程序时出现错误。
undefined reference to boost::system::system_category()
我做错了什么?
您使用的boost库取决于boost_system库。 (并不是所有人都这么做)
假设您使用gcc,请尝试将-lboost_system
添加到您的编译器命令行,以便链接到该库。
链接一个定义缺失符号的库( -lboost_system
)是显而易见的解决scheme,但在Boost.System的特殊情况下,原始devise中的一个错误特性使其使用boost::system::generic_category()
和boost::system::system_category()
不必要的。 使用-DBOOST_SYSTEM_NO_DEPRECATED
标志进行-DBOOST_SYSTEM_NO_DEPRECATED
会禁用该代码,并且可以在不需要-lboost_system
情况下编译一些程序(当然,如果明确地使用某些库的function,该链接仍然是需要的)。
从Boost 1.66开始,这个行为现在是默认的,所以希望越来越less的用户需要这个答案。
正如@AndrewMarshall所注意到的,另一种方法是定义BOOST_ERROR_CODE_HEADER_ONLY
,它启用了代码的仅标题版本。 然而,这是由Boost 阻止 ,因为它可以打破一些function。
上面的错误是一个链接器错误…链接器一个程序,接受一个或多个由编译器生成的对象,并将它们组合成一个可执行程序。
你必须给链接器标志添加'-l boost_system',它向链接器指示它必须在库libboost_system.so
查找像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
我得到了同样的问题:
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的debugging版本:
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
但为什么?
当使用CMAKE和find_package时,确保它是:
find_package(Boost COMPONENTS system ...)
并不是
find_package(boost COMPONENTS system ...)
有些人可能已经失去了小时
…如果你想连接你的主静态,在你的Jamfile中添加以下要求:
<link>static <library>/boost/system//boost_system
也许还有:
<linkflags>-static-libgcc <linkflags>-static-libstdc++
在我的情况下,添加-lboost_system
是不够的,它仍然无法在我的自定义生成环境中find它。 我不得不使用“gcc – / usr / bin / ld:warning lib not found”的build议 ,并将我的./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!
当我有这个问题,原因是图书馆的顺序。 为了解决这个问题,我把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在mingw上,用一个简单的定时器例子来提升1.61.0。