我有 crosstool-NG c++ 工具链(用它构建的 gcc 和 Boost 库),我使用它构建了这个 hello world 项目:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(HelloBoost)
set(CMAKE_CXX_STANDARD 20)
find_package(Boost 1.84.0 REQUIRED COMPONENTS filesystem)
link_directories(/home/vchistyakov/pt/647/output/toolchain/x86_64-pt-linux-gnu/sysroot/lib /home/vchistyakov/pt/647/output/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(HelloBoost main.cpp)
target_link_libraries(HelloBoost ${Boost_LIBRARIES})
else()
message(FATAL_ERROR "Boost not found")
endif()
main.cpp:
#include <iostream>
#include <boost/filesystem.hpp>
int main() {
boost::filesystem::path p = boost::filesystem::current_path();
std::cout << "Current path is: " << p << std::endl;
return 0;
}
工具链.cmake:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_SYSROOT "/tmp/toolchain/x86_64-pt-linux-gnu/sysroot")
set(CMAKE_C_COMPILER "/tmp/toolchain/bin/x86_64-pt-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/tmp/toolchain/bin/x86_64-pt-linux-gnu-g++")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
编译没有问题,但是当我在目标操作系统上运行二进制文件时,出现分段错误:
LD_LIBRARY_PATH=/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/lib:/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib gdb ./HelloBoost
我做错了什么?
问题出在动态链接器(“ld-linux-x86-64.so.2”)上。为了成功运行该程序,我必须通过运行以下命令将其从工具链更改为链接器:
patchelf --set-interpreter /tmp/toolchain/x86_64-pt-linux-gnu/sysroot/lib64/ld-linux-x86-64.so.2 HelloBoost
LD_LIBRARY_PATH=/tmp/toolchain/x86_64-pt-linux-gnu/sysroot/usr/lib ./HelloBoost