提升链接失败

时间:2011-11-09 01:12:15

标签: c++ file boost linker

我有以下代码,我试图编译:

#include <boost/filesystem/convenience.hpp>
#include <boost/foreach.hpp>
#include <boost/range.hpp>
#include <iostream>

int main(int, char**)
{
    namespace bf = boost::filesystem;
    BOOST_FOREACH(bf::path path,
            boost::make_iterator_range(
                bf::recursive_directory_iterator(bf::path("/home")),
                bf::recursive_directory_iterator())) {
        std::cout << path.string() << std::endl;
    }
    return 0;
}

我的提升库位于/ home / foo / include中。并且包含文件实际上就在那里。

当我运行以下内容时:

g++ -I/home/foo/include/ test.cc

我收到以下错误。我怎么解决这个问题。我该怎么办?

/tmp/ccvDmFNL.o(.text+0x502): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `boost::system::get_system_category()'
/tmp/ccvDmFNL.o(.text+0x51b): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `boost::system::get_generic_category()'
/tmp/ccvDmFNL.o(.text+0x534): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `boost::system::get_generic_category()'
/tmp/ccvDmFNL.o(.text+0x54d): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `boost::system::get_generic_category()'
/tmp/ccvDmFNL.o(.text+0x566): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `boost::system::get_system_category()'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE6m_initERKS4_+0x2e): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::m_init(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
: undefined reference to `boost::filesystem::detail::not_found_error()'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE6m_initERKS4_+0xbe): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::m_init(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
: undefined reference to `boost::filesystem::detail::dir_itr_first(void*&, void*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::filesystem::file_status&, boost::filesystem::file_status&)'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost6system10error_codeC1Ev+0x14): In function `boost::system::error_code::error_code()':
: undefined reference to `boost::system::get_system_category()'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem24basic_directory_iteratorINS0_10basic_pathISsNS0_11path_traitsEEEE9incrementEv+0xde): In function `boost::filesystem::basic_directory_iterator<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::increment()':
: undefined reference to `boost::filesystem::detail::dir_itr_increment(void*&, void*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::filesystem::file_status&, boost::filesystem::file_status&)'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem6statusINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EENS0_11file_statusEE4typeERKS7_+0x34): In function `boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, boost::filesystem::file_status>::type boost::filesystem::status<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
: undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::system::error_code&)'
/tmp/ccvDmFNL.o(.gnu.linkonce.t._ZN5boost10filesystem6detail11dir_itr_impINS0_10basic_pathISsNS0_11path_traitsEEEED1Ev+0x1d): In function `boost::filesystem::detail::dir_itr_imp<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >::~dir_itr_imp()':
: undefined reference to `boost::filesystem::detail::dir_itr_close(void*&, void*&)'
collect2: ld returned 1 exit status

修改

现在我试过了:

g++ -I/home/foo/include/ test.cc -lboost_system -lboost_filesystem

并收到以下错误:

/usr/bin/ld: cannot find -lboost_system 
collect2: ld returned 1 exit status

我在

中有libboost_system-gcc34-1_38.so
/home/foo/lib

我该如何指出?

4 个答案:

答案 0 :(得分:11)

来自gcc手册页:

-Ldir Add directory dir to the list of directories to be searched for -l.

那么,您是否缺少-L/home/foo/lib到命令行?

使用以下命令在我的linux机器(Ubuntu 10.04,boost-filesystem 1.40)上正确编译您的代码:

g++ test.cpp -lboost_filesystem

g++ test.cpp -lboost_system -lboost_filesystem

它给了我g++ test.cpp -lboost_system

的编译错误

答案 1 :(得分:2)

如果它们不在默认位置,您必须告诉编译器/链接器库的位置。为此,您必须使用-L标志来编译:

g++ -I/home/y/include/ test.cc -L/home/foo/lib -lboost_system -lboost_filesystem

答案 2 :(得分:1)

添加-lboost_system-lboost_system-mt,如果您要进行线程化)和-lboost_filesystem-lboost_filesystem-mt,如果您要进行线程化)到cmdline,之前任何输入文件。

答案 3 :(得分:1)

您的提升库似乎使用后缀gcc34-1_38进行修饰。你在使用gcc 3.4吗?你的升级库是库路径吗?如果不是,您可能需要使用-L标志向g ++添加增强库的路径,或者您可以添加LD_LIBRARY_PATH环境变量的路径。在任何情况下,您都可以使用-lboost_system-gcc34-1_38-lboost_filesystem-gcc34-1_38链接到您的提升库。