gpt4 book ai didi

c++ - 与Boost Filesystem的静态链接不起作用

转载 作者:行者123 更新时间:2023-12-02 10:05:28 27 4
gpt4 key购买 nike

我正在尝试从源代码构建增强功能,并且在考虑将此静态链接的增强功能项目移至AWS lambda服务器时,我需要静态链接。

我已完成以下步骤:

  • 我在third_party目录中下载了boost_1_72_0.tar.gz和tar xzvf boost_1_72_0.tar.gz
  • boost_1_72_0中的
  • cd
  • 我要安装的
  • DST_DIR=/my local path/
  • ./bootstrap.sh --prefix=${DST_DIR} --includedir=${DST_DIR} --libdir={DST_DIR} --with-libraries=filesystem,system
  • ./b2 link=static --prefix=${DST_DIR} install --DST_DIR内创建include和lib目录
  • 在我的构建目录中,我正在执行CMake,其中存在我的CMakeLists.txt。
  • CMake命令可以正常工作。
  • 但是make命令给出了错误。

  • 这是我的CMakeLists.txt
    cmake_minimum_required(VERSION 3.5)

    set(CMAKE_CXX_STANDARD 11)
    project(executable LANGUAGES CXX)

    set(TARGET "/path to boost directory/boost_1_72_0")

    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREADED ON)
    set(Boost_USE_STATIC_RUNTIME OFF)

    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
    SET(BUILD_SHARED_LIBS OFF)
    SET(CMAKE_EXE_LINKER_FLAGS "-static")

    set(Boost_NO_SYSTEM_PATHS True)

    message(STATUS "${Boost_NO_SYSTEM_PATHS}")
    if (Boost_NO_SYSTEM_PATHS)
    set(BOOST_ROOT "${TARGET}")
    message(STATUS "${Boost_ROOT}")
    set(BOOST_INCLUDE_DIRS "${TARGET}/include/")
    set(BOOST_LIBRARY_DIRS "${TARGET}/lib/")
    endif (Boost_NO_SYSTEM_PATHS)

    message(STATUS "${BOOST_INCLUDE_DIRS}")
    message(STATUS "boost library dirs")
    message(STATUS "${BOOST_LIBRARY_DIRS}")
    find_package(Boost REQUIRED filesystem system)
    if(Boost_FOUND)
    include_directories(${BOOST_INCLUDE_DIRS})
    add_executable(${PROJECT_NAME} "execute_code.cpp")
    message(STATUS "boost libraries" "${BOOST_LIBRARIES}")
    target_link_libraries(executable ${BOOST_LIBRARIES})
    endif()

    execute_code.cpp
    #include <boost/filesystem.hpp>
    #include<iostream>

    bool path_exists(string file_path)
    {
    boost::filesystem::path p{file_path};
    return boost::filesystem::exists(p);
    }

    int main(int argc, char** argv) {
    string source_file = argv[1];
    if (!path_exists(source)) {
    cout << "source file doesn't exist";
    return 0;
    }
    return 0;
    }

    我得到的错误是:
    CMakeFiles/executable.dir/execute_code.cpp.o: In function `boost::filesystem::exists(boost::filesystem::path const&)':
    execute_code.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x2f): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
    collect2: error: ld returned 1 exit status
    CMakeFiles/executable.dir/build.make:113: recipe for target 'executable' failed
    make[2]: *** [executable] Error 1
    CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/executable.dir/all' failed
    make[1]: *** [CMakeFiles/executable.dir/all] Error 2
    Makefile:83: recipe for target 'all' failed
    make: *** [all] Error 2

    我是C++和CMake的新手。有什么愚蠢的东西,我在这里想念吗?

    我经历了 How can I get CMake to find my alternative Boost installation?和其他答案,但对于我来说似乎不起作用。

    最佳答案

    您似乎对Boost使用了旧的CMake变量。从Boost 1.70开始,Boost现在提供CMake支持,使CMake可以更轻松地为您的项目查找和使用Boost(请参阅this页上的文档)。

    在构建Boost时,您将看到每个Boost库的CMake软件包配置文件(通常与构建的库一起放置在cmake文件夹中)。您可以在find_package()模式下使用CONFIG查找这些程序包配置文件。这些提供了可直接链接到的导入目标,例如Boost::filesystem。这样,如果缺少filesystem库,则在编译/链接失败时,您不必浏览BOOST_LIBRARIES变量中的库列表。相反,CMake会告诉您在CMake配置时缺少该库。

    而且,Boost库依赖关系现在应该自动解决。因此,如果您使用的是filesystem,则也不必再显式调出system库。 Boost应该为您解决此依赖性。经过这些更改,您的find_package()命令用法可能如下所示:

    find_package(Boost CONFIG REQUIRED filesystem)
    if(Boost_FOUND)
    add_executable(${PROJECT_NAME} "execute_code.cpp")
    target_link_libraries(executable PRIVATE Boost::filesystem)
    endif()

    对于它的值(value),您可以运行 make VERBOSE=1在链接阶段查看详细输出,以验证是否已链接了所有正确的库。您应该能够看到Boost的 filesystemsystem库已链接,并且可以验证它们是否是所需的静态( .a)库。

    关于c++ - 与Boost Filesystem的静态链接不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60395828/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com