我在使用 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
我希望这可以帮助别人。