与Boost Filesystem的静态链接不起作用 [英] Static linking with Boost Filesystem not working

查看:47
本文介绍了与Boost Filesystem的静态链接不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to build boost from source and I need static linking as I am thinking to move this statically linked boost project to AWS lambda servers.

我已完成以下步骤:

  1. 我在第三方目录中下载了boost_1_72_0.tar.gz和 tar xzvf boost_1_72_0.tar.gz .
  2. boost_1_72_0内的
  3. cd .
  4. DST_DIR =/我要安装的本地路径/.
  5. ./bootstrap.sh --prefix = $ {DST_DIR} --includedir = $ {DST_DIR} --libdir = {DST_DIR} --with-libraries =文件系统,系统.
  6. li>
  7. ./b2 link = static --prefix = $ {DST_DIR} install-会在 DST_DIR
  8. 内创建include和lib目录
  9. 在我的构建目录中,我正在执行CMake,其中存在我的CMakeLists.txt.
  10. CMake命令工作正常.
  11. 但是 make 命令给出了错误.
  1. I downloaded boost_1_72_0.tar.gz and tar xzvf boost_1_72_0.tar.gz inside third_party directory.
  2. cd inside boost_1_72_0.
  3. DST_DIR=/my local path/ where I want to install.
  4. ./bootstrap.sh --prefix=${DST_DIR} --includedir=${DST_DIR} --libdir={DST_DIR} --with-libraries=filesystem,system.
  5. ./b2 link=static --prefix=${DST_DIR} install --which creates include and lib directories inside DST_DIR
  6. Inside my build directory I am doing CMake where my CMakeLists.txt is present.
  7. The CMake command works fine.
  8. But the make command gives an error.

这是我的CMakeLists.txt

Here is my 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

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的新手.有什么愚蠢的东西,我在这里想念吗?

I am new to C++ and CMake. Is there anything silly, which I am missing here?

我经历了我如何获得CMake可以找到我的替代Boost安装吗?和其他答案,但似乎不适用于我的情况.

I went through How can I get CMake to find my alternative Boost installation? and other answers but doesn't seem to work in my case.

推荐答案

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

You seem to be using the old CMake variables for Boost. As of Boost 1.70, Boost now provides CMake support to make it easier for CMake to find and use Boost for your project (see documentation on this page).

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

When you build Boost, you will see CMake package configuration files for each Boost library (typically placed along with the built libraries in a cmake folder). You can use find_package() in CONFIG mode to find these package configuration files. These provide imported targets such as Boost::filesystem that you can link to directly. This way, if the filesystem library is missing, you don't have to sift through the list of libraries in the BOOST_LIBRARIES variable when compilation/linking fails. Instead, CMake will tell you the library is missing at the CMake configure-time.

此外,Boost库依赖关系现在应该自动解决.因此,如果您使用的是文件系统,则不再需要显式调用 system 库.Boost应该为您解决此依赖性.通过这些更改,您的 find_package()命令用法可能如下所示:

Also, the Boost library dependencies should now be resolved automatically. So, if you're using filesystem, you should no longer have to explicitly call out the system library also. Boost should resolve this dependency for you. With these changes, your find_package() command usage could look like this:

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


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


For what it's worth, you can run make VERBOSE=1 to see the verbose output at the link stage to verify that all the correct libraries are being linked. You should be able to see that Boost's filesystem and system libraries are linked, and you can verify they are the desired static (.a) libraries.

这篇关于与Boost Filesystem的静态链接不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆