使用Boost.Filesystem的无法链接程序(Can't link program u

2019-07-23 11:24发布

我试图运行程序,用在Ubuntu 12.10的boost ::文件系统的示例代码,但它并不想构建。

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
using namespace std;

void fun(const string& dirPath);
int main()
{
    fun("/home");
    return 0;
}

void fun(const string& dirPath)
{
    path p (dirPath); 

    if (exists(p))  
    {
        if (is_regular_file(p))   
            cout << p << " size is " << file_size(p) << '\n';

        else if (is_directory(p))    
            cout << p << "is a directory\n";

        else
            cout << p << "exists, but is neither a regular file nor a directory\n";
    }
    else
        cout << p << "does not exist\n";
}

和CMake的代码:

project(tttest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
FIND_PACKAGE(Boost 1.53 COMPONENTS filesystem system REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES})

不幸的是,生成错误

CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::exists(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_directory(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_regular_file(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem15is_regular_fileERKNS0_4pathE[_ZN5boost10filesystem15is_regular_fileERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
main.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

这是什么问题的原因以及如何解决呢?

Answer 1:

提高文件系统是有一些相对于函数签名变化ABI问题Boost库中的一个由于C ++ 0x或C ++ 11。 CF升压票: https://svn.boost.org/trac/boost/ticket/6779

你有三种解决方案:

  1. 抑制C ++ 11作用域在包括在具有的#include您的程序有关Boost头文件的文件枚举(CF http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference -to-boostfilesystemdetailcopy_file / ):

     #define BOOST_NO_CXX11_SCOPED_ENUMS #include <boost/filesystem.hpp> #undef BOOST_NO_CXX11_SCOPED_ENUMS 

    但是,这种解决方案是不完整的一个,我看它不为大家工作。

  2. 构建与C ++ 11的选择BOOST(你使用你的应用程序相同的选项): http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide

    我看也并不为大家工作。

  3. 设置一个专门为您的应用程序,你重建你在一个专用的环境中所需的所有库交叉编译器。 这保证了连贯性以及稳定性加上更多可维护性,肯定是要推荐的解决方案。 如果它已经过测试,我还没有看到 - 或许是肯定的,而且很可能它的工作原理。 总之,交叉编译很好,现在在计算机科学掌握。 你会发现很多好的教程和对它的支持。 在Linux中的Gentoo,他们有了不起的SYS-devel的/ crossdev包,使得它很容易。

就我自己来说,解决方案1已经解决了这个问题。 当我遇到一个又一个,我会切换到解决方案3。因此,我还没有测试它。



Answer 2:

您需要链接时增添libboost_filesystem库。 或libboost_filesystem-MT,如果您的应用程序的多线程。 像这样:

g++ -o file -lboost_filesystem-mt source_file.cpp


Answer 3:

为我工作的解决方案是编译“-c”,然后创建这样的可执行文件:

g++ -c -o main.o main.cpp
g++ -o my_prog main.o -lboost_system -lboost_filesystem


Answer 4:

对于一些升压模块,你需要编译库 (使用bootstrap.sh)将它们链接。 你的情况,你必须编译和链接Filesystem ,并probalbly System

看看这里

例如:

  • ./bootstrap.sh(的bjam)
  • 室射频bin.v2阶段(2之间的bjam命令)
  • ./bjam释放工具集= GCC地址模型= 64 CXXFLAGS = -fPIC
  • ./bjam调试工具集= GCC地址模型= 64 CXXFLAGS = -fPIC

如果您在Windows上链接,您不必手动链接你的库,因为他们使用的编译自动链接。 在Linux上,你必须这样做。

根据文件,这些模块需要你购买或修建图书馆:

  • Boost.Filesystem的
  • Boost.GraphParallel
  • 了Boost.Iostreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python的
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave


Answer 5:

您需要添加以下库:

g++ -o file -lboost_system -lboost_filesystem sourcefile.cpp

如果你使用一个Makefile:

CC=gcc
CXX=g++
PROG = program
CXXFLAGS := -std=c++1y -g -Wall
LDFLAGS = -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu
LIBS= -lboost_system -lboost_filesystem

SRCS= main.cpp

OBJS=$(subst .cpp,.o,$(SRCS))

all: $(OBJS)
     $(CXX) $(CXXFLAGS) -o $(PROG) $(OBJS) $(LIBS) $(LDFLAGS)


文章来源: Can't link program using Boost.Filesystem
标签: c++ boost cmake