c++ boost 库问题:找不到 -lboost_system ld 返回 1 退出状态

c++ boost 库问题:找不到 -lboost_system ld 返回 1 退出状态

我在使用 boost 时遇到了问题。我使用以下命令安装了 boost 后

sudo apt-get install python-dev 
sudo apt-get install libboost-python1.54 
sudo apt-get install libboost-system1.54 libboost-filesystem1.54 
tar -zxf Boost-2014.10.tar.gz 
cd ~/build-2014.10/ 
./bootstrap.sh 
sudo ./b2 install -j8 --prefix=/usr --libdir=/usr/lib --includedir=/usr/include --build-type=minimal variant=release --layout=tagged threading=single threading=multi

boost 版本是 1.57。然后我运行一个例子来测试。代码如下

#include <iostream>
using namespace std;
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
int main(){
    cout<<"hello"<<endl;
     int a=boost::lexical_cast<int>("123456");
     cout<<"boost "<<a<<endl;
     return 1;} 

然后我编译它,错误显示

g++ test -o test.cpp -lboost_system
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status

如果我删除行

#include <boost/filesystem.hpp>

并使用

g++ test -o test.cpp it works.

如何解决?

答案1

确保您了解头文件和库之间的区别。

头文件(例如 /usr/include/boost/filesystem.hpp)是您在源代码中用作#include指令的一部分的文件。C++ 预处理器会读取该文件并向您的程序添加一堆声明。

库是各种函数、静态数据和其他内容的编译集合。使用参数时,-lboost_system您告诉编译器“编译我的程序并将其与库 libboost_system 链接”。

您的链接器抱怨找不到该库 ( /usr/bin/ld: cannot find -lboost_system)。可能的原因是脚本./bootstrap.sh未在正确的目录中安装 boost。

从现在开始您有几个选择。

如果您想坚持使用 Boost-2014.10.tar.gz,您就得靠自己了。

我建议安装软件包libboost-dev。它将安装您系统的当前 boost 版本,并将所有文件放在适当的位置。

最后:当您#include从文件中删除该行时,它仍然有效,但这只是因为您的程序不使用 boost::system 中的任何功能。如果您使用任何 boost 类/函数,并且没有包含正确的标头,您将收到编译错误。

答案2

参数的顺序似乎很重要,前提是 boost 包之前已经正确安装了

apt-get install -y libboost-dev

例如,当像这样编译时(首先是 cpp 文件,然后是库列表), 没有任何问题

g++ app.cpp -std=c++11 -lboost_system -lboost_filesystem

但下面的命令会导致错误

g++ -std=c++11 -lboost_system -lboost_filesystem  app.cpp
g++ -std=c++11 -lboost_system -lboost_filesystem  app.cpp
/tmp/cc3kjjNn.o: In function `__static_initialization_and_destruction_0(int, int)':
app.cpp:(.text+0x9b): undefined reference to `boost::system::generic_category()'
app.cpp:(.text+0xa7): undefined reference to `boost::system::generic_category()'
app.cpp:(.text+0xb3): undefined reference to `boost::system::system_category()'
/tmp/cc3kjjNn.o: In function `boost::filesystem::exists(boost::filesystem::path const&)':
app.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

参数顺序略有不同会导致不同的错误

g++  -std=c++11  -lboost_system app.cpp -lboost_filesystem
/usr/bin/ld: /tmp/cc5p9PJh.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

此外 -lboost_xyz 不应包含.so后缀,否则

/usr/bin/ld: cannot find -lboost_filesystem.so

我希望这可以帮助别人。

答案3

$ sudo apt policy libboost-* | grep system

$ sudo apt policy libboost-* | grep filesystem

$ sudo apt install libboost-system-dev

$ sudo apt install libboost-filesystem-dev

在此处输入图片描述

相关内容