cmake 无法使用Boost.Filesystem链接程序

nkoocmlb  于 2023-10-20  发布在  其他
关注(0)|答案(5)|浏览(201)

我尝试运行程序,使用Ubuntu 12.10上的boost::filesystem示例代码,但它不想构建。

#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

这一问题产生的原因是什么,如何解决?

4xrmg8kj

4xrmg8kj1#

Boost文件系统是Boost库中的一个,由于C0x或C11(cf old Boost trac-ticket)而存在与函数签名更改相关的ABI问题。
你有三个解决方案:
1.使用#include(cf http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference-to-boostfilesystemdetailcopy_file/)禁止程序中包含的相关Boost头文件中的C++11作用域枚举:

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

但这个解决方案并不是一个完整的解决方案,我读到它并不适用于每个人。
1.使用C++11选项构建BOOST(与您的应用程序使用的选项相同):http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide
我也读到它并不适用于所有人。
1.设置一个专用于您的应用程序的交叉编译器,您可以在专用环境中重建所需的所有库。这确保了一致性、稳定性和更高的可维护性,当然是值得推荐的解决方案。我没有读过它是否经过测试-可能是的,可能它的工作。无论如何,交叉编译现在在计算机科学中已经被很好地掌握了。你会发现很多很好的教程和支持它。在Linux Gentoo中,他们有一个了不起的sys-devel/crossdev包,这使得它非常容易。
在我自己的情况下,解决方案1解决了问题。一旦我遇到另一个,我会切换到解决方案3。所以,我还没有测试过。

wgeznvg7

wgeznvg72#

链接时需要添加libboost_filesystem库。或者libboost_filesystem-mt(如果应用程序是多线程的)。就像这样:

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

thtygnil3#

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

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

8wtpewkr4#

对于某些boost模块,您必须编译库链接它们(使用bootstrap.sh)。
看看here

例如:

  • ./bootstrap.sh(bjam)
  • rm -rf bin.v2阶段(2个bjam命令之间)
  • ./bjam release toolset=gcc address-model=64 cxxflags=-fPIC
  • ./bjam debug toolset=gcc address-model=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
bis0qfac

bis0qfac5#

您需要添加以下库:

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)

相关问题