我发现了很多类似的问题,但是我无法为我应用任何给定的解决方案。几个月前,我使用Boost库进行了一个项目。我只是在命令行中进行了编译,如boost网站所述。
g++ -I pathToBoost file.cpp -o file -lboost_system -lboost_filesystem
还完成了到boost_system和boost_filesystem的两个必需链接。效果很好,但是现在当我再次尝试编译它时突然出现错误。
/usr/bin/ld: /tmp/ccM2BzEo.o: in function `boost::system::generic_category()':
file.cpp:(.text._ZN5boost6system16generic_categoryEv[_ZN5boost6system16generic_categoryEv]+0x7):
undefined reference to `boost::system::detail::generic_category_instance'
好吧,在我看来,链接boost_system库时出错。既然以前也可以使用,那么编译器可能会出现问题吗?
我用过
Boost 1.68.0
g++ (GCC) 8.2.1
ManjaroLinux 18.0.3
我希望有人能在这里为我提供帮助,而且我不只是愚蠢到在另一个线程中看到解决方案。
问候!
答案 0 :(得分:1)
链接器命令行中库的顺序很重要。 boost_filesystem
取决于boost_system
,因此解决方法:
-lboost_filesystem -lboost_system
或者,您可以用--start-group
和--end-group
包围库列表,以使链接程序多次重新扫描库,直到它失败或解析所有符号为止,从而没有特定的顺序命令行中的库是必需的。但是,链接可能需要更长的时间。例如:
g++ -I pathToBoost file.cpp -o file -Wl,--start-group -lboost_system -lboost_filesystem -Wl,--end-group
由于您指定了-I pathToBoost
,因此您还需要指定-L<path-to-boost-libs> -Wl,-rpath=<path-to-boost-libs>
。否则,它将使用来自pathToBoost
的boost的一个版本的标头,但会通过系统boost链接错误的库。