与Boost Filesystem的静态链接不起作用 [英] Static linking with Boost Filesystem not working
问题描述
我正在尝试从源代码构建增强功能,并且在我想将此静态链接的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.
我已完成以下步骤:
- 我在第三方目录中下载了boost_1_72_0.tar.gz和
tar xzvf boost_1_72_0.tar.gz
. boost_1_72_0内的 -
cd
. -
DST_DIR =/我要安装的本地路径/
. -
./bootstrap.sh --prefix = $ {DST_DIR} --includedir = $ {DST_DIR} --libdir = {DST_DIR} --with-libraries =文件系统,系统
. li> -
./b2 link = static --prefix = $ {DST_DIR} install-
会在DST_DIR
内创建include和lib目录 - 在我的构建目录中,我正在执行CMake,其中存在我的CMakeLists.txt.
- CMake命令工作正常.
- 但是
make
命令给出了错误.
- I downloaded boost_1_72_0.tar.gz and
tar xzvf boost_1_72_0.tar.gz
inside third_party directory. cd
inside boost_1_72_0.DST_DIR=/my local path/
where I want to install../bootstrap.sh --prefix=${DST_DIR} --includedir=${DST_DIR} --libdir={DST_DIR} --with-libraries=filesystem,system
../b2 link=static --prefix=${DST_DIR} install --
which creates include and lib directories insideDST_DIR
- Inside my build directory I am doing CMake where my CMakeLists.txt is present.
- The CMake command works fine.
- 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屋!