Answers:
您使用的boost库取决于boost_system库。(并非所有人都这样做。)
假设您使用gcc,请尝试添加-lboost_system
到编译器命令行中,以针对该库进行链接。
-lboost_system
,所以它是这样的:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
。它并没有帮助...
sslsniff_LDFLAGS
了sslsniff_LDADD
它,但没有用。然后,我都保留sslsniff_LDFLAGS
并添加了sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
。然后我就可以编译了。感谢您的帮助!
与定义的缺失的符号(一个库链接-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开始,仅标头似乎已成为默认值,据说已使这个问题过时了。
BOOST_ERROR_CODE_HEADER_ONLY
。
对于那些不需要整个shebang的人,另一个解决方法是:使用开关
-DBOOST_ERROR_CODE_HEADER_ONLY
。
如果您使用CMake,则为add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
。
上面的错误是一个链接器错误……链接器是一个程序,该程序接受一个或多个由编译器生成的对象,并将它们组合为一个可执行程序。
您必须添加-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
我有同样的问题:
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
但为什么?
当我遇到这个问题时,原因是库的排序。为了解决这个问题,我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:警告lib未找到”的建议,并将./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链接!”
...并且如果您想静态链接主链接,请在Jamfile中将以下内容添加到需求中:
<link>static
<library>/boost/system//boost_system
也许还有:
<linkflags>-static-libgcc
<linkflags>-static-libstdc++