我遇到了Boost的文件系统库(1.60.0)的问题。花了几个小时撕掉我的代码,假设这是我做错了,我尝试运行Boost自己的文件系统示例并遇到了同样的问题。在OSX上使用gcc编译时,所有这些都可以正常工作,但在Ubuntu 14.04上则不行。
我尝试在代码中定义BOOST_NO_CXX11_SCOPED_ENUMS,并在运行g ++时尝试将其作为参数。我也尝试删除-std = c ++ 11(我在一个案例中看到过,这似乎有助于遇到此问题的人)。无论如何,它总是在Ubuntu上失败。我正在使用的Boost示例是:
// tut1
#include <iostream>
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << "Usage: tut1 path\n";
return 1;
}
std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
return 0;
}
尝试编译的结果如下:
vagrant@testing:~/boost_fs_test$ g++ -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2
/tmp/cck0AVVX.o: In function `__static_initialization_and_destruction_0(int, int)':
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()'
/tmp/cck0AVVX.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status
vagrant@testing:~/boost_fs_test$ g++ -std=c++11 -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2
/tmp/cceGCjpc.o: In function `__static_initialization_and_destruction_0(int, int)':
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()'
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()'
/tmp/cceGCjpc.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status
我三重检查了我如何安装Boost,一切看起来都正确。 libs绝对是在正确的位置:
-rw-rw-r-- 1 vagrant vagrant 237886 Jan 8 08:41 libboost_filesystem.a
lrwxrwxrwx 1 vagrant vagrant 29 Jan 8 08:40 libboost_filesystem.so -> libboost_filesystem.so.1.60.0
-rwxrwxr-x 1 vagrant vagrant 126186 Jan 8 08:40 libboost_filesystem.so.1.60.0
-rw-rw-r-- 1 vagrant vagrant 49226 Jan 8 08:41 libboost_system.a
lrwxrwxrwx 1 vagrant vagrant 25 Jan 8 08:40 libboost_system.so -> libboost_system.so.1.60.0
-rwxrwxr-x 1 vagrant vagrant 20469 Jan 8 08:40 libboost_system.so.1.60.0
同样精确的代码在OSX上编译得很好,但是:
jack-burton:boost_fs fny$ g++ -std=c++11 -I/usr/local/Cellar/boost/1.60.0_1/include -L/usr/local/Cellar/boost/1.60.0_1/lib -lboost_system -lboost_filesystem test2.cpp -o test2
jack-burton:boost_fs fny$ ls
test2 test2.cpp
jack-burton:boost_fs fny$ ./test2 test2.cpp
test2.cpp 321
我不确定我在这里缺少什么。为了好奇,我尝试使用apt来安装Boost(安装了1.54)并遇到了同样的问题。
答案 0 :(得分:2)
好吧,我通过一些令人沮丧的试验和错误来解决这个问题。 :)
在CentOS和Ubuntu上,我按照以下方式安装Boost:
sudo ./b2 install link=static --with-system --with-filesystem
然后,编译:
g++ -std=c++11 -I/usr/local/include -L/usr/local/lib test.cpp -lboost_system -lboost_filesystem -o test
密钥似乎是gcc命令中libs的位置。将它们放在源文件之后似乎可以解决问题。我完全没有将Boost从项目中删除,但幸运的是,这使得我不必重写相当多的代码。这可能是一个令人难以置信的愚蠢错误,但是TIL ......
答案 1 :(得分:0)
看起来你正在链接反对作为共享库编译的boost,尝试使用-DBOOST_ALL_DYN_LINK
编译或显式编译boost作为静态库./b2 link=static