2017-01-08 54 views
1

boost :: filesystem未定义的引用错误我遇到了Boost的文件系统库(1.60.0)的问题。花了几个小时撕掉我的代码,假设它是我做错了,我试着运行Boost自己的文件系统的例子,并有同样的问题。所有这些在OSX上使用gcc进行编译时都可以正常工作,但在Ubuntu 14.04上不能使用。尽管使用BOOST_NO_CXX11_SCOPED_ENUMS

我试着在代码中定义BOOST_NO_CXX11_SCOPED_ENUMS,并且在运行g ++时也尝试了它作为参数。我也尝试删除-std = C++ 11(我在一个案例中看到,似乎可以帮助遇到此问题的人)。无论如何,它在Ubuntu上总是失败。我使用升压例子是这样的:

// 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; 
} 

并试图编译看起来像这样的结果:

[email protected]:~/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 

[email protected]:~/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 

我三重检查我如何安装升压,一切看起来是正确的。该库肯定是在正确的地方:

-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

它看起来像你链接升压编译为一个共享库,尝试用​​-DBOOST_ALL_DYN_LINK或明确编译提升作为静态库./b2 link=static

+0

没有任何运气,似乎。我先尝试了BOOST_ALL_DYN_LINK。然后我再次运行b2时尝试添加link = static。我发现它现在在lib文件夹中有一个.a文件,但仍然没有像以前那样编译测试代码时出现相同的错误。 – fny82

+0

你确定包含路径是否正确?您的构建命令中的这些路径似乎表明您正在安装对根目录​​的提升并重新排列包含路径,这看起来很不寻常。你有没有尝试以'sudo ./b2 install'的正常方式来执行它? – PhantomPilot

+0

是的,我尝试的/ boost路径绝对正确。我没有尝试安装它没有指定安装位置,所以我只是尝试使用'sudo ./b2 install'没有任何其他参数。在尝试编译测试程序时,无论是否显式传递路径以包含/ lib在/ usr/local下,都会发生相同的问题。 :(合适的库肯定存在于/ usr/local/lib下 – fny82

2

好了编译,我有一些令人沮丧的试验和错误想通了这一点。 :)

在这两个的CentOS和Ubuntu,我把它通过安装升压如下工作:

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 ...