You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

交叉编译cpr库时C++版本不匹配问题求助

交叉编译cpr库后运行出现CXXABI/GLIBCXX版本缺失错误

问题描述

编译链接cpr库及依赖的静态curl均正常,但运行程序时触发以下错误:

/tmp/[project name]: /usr/lib/libstdc++.so.6: version 'CXXABI_1.3.11' not found (required by /tmp/[project name] 
/tmp/[project name]: /usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.26' not found (required by /tmp/[project name] 

程序会尝试调用主机/usr/lib下的libstdc++.so.6,而非目标架构的库,使用VisualGDB Verbose模式也无法追踪原因。仅调用cpr的Post方法就触发错误,编译链接无报错但无法执行代码。

已完成的配置

curl交叉编译配置

已交叉编译静态curl(禁用多数功能),示例可正常运行,configure命令:

sudo ./configure --host=arm-linux-gnueabihf --build=x86_64-linux-gnu --without-ssl --disable-ipv6 --without-brotli --without-libpsl --without-nghttp2 --without-ngtcp2 --without-zstd --without-libidn2 --without-librtmp --without-zlib --disable-shared --enable-static --disable-threaded-resolver --disable-pthreads  --prefix=/usr/arm-linux-gnueabihf AR=arm-linux-gnueabihf-gcc-ar-9 RANLIB=arm-linux-gnueabihf-gcc-ranlib-9 CC=/usr/bin/arm-linux-gnueabihf-gcc-9 CXX=/usr/bin/arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld AS=arm-linux-gnueabihf-gcc-as CROSS_COMPILE=arm-linux-gnueabihf CFLAGS=-I/usr/arm-linux-gnueabihf/include LDFLAGS=-L/usr/arm-linux-gnueabihf/lib PATH=$PATH:/usr/arm-linux-gnueabihf/bin

环境参数:

LDFLAGS=-L/usr/arm-linux-gnueabihf/lib
CPPFLAGS=-I/usr/arm-linux-gnueabihf/include
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/arm-linux-gnueabihf/bin:/usr/arm-linux-gnueabihf/bin

编译后链接到/usr/arm-linux-gnueabihf/lib/libcurl.a。

cpr编译配置

cmake命令:

sudo cmake -DCURL_LIBRARY=/usr/arm-linux-gnueabihf/lib -DCURL_INCLUDE_DIR=/usr/arm-linux-gnueabihf/include -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf -DCMAKE_TOOLCHAIN_FILE=/home/[username]/include/toolchain.cmake -DCPR_ENABLE_SSL=OFF -DCURL_ZLIB=OFF -DCPR_USE_SYSTEM_CURL=ON -DBUILD_SHARED_LIBS:BOOL=OFF --debug-output .. 

工具链文件内容(存在语法错误):

set(CMAKE)SYSTEM)NAME Linux)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc-9)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH /usr/bin)

编译参数

  • 链接库:pthread curl cpr
  • CFLAGS:-ggdb -ffunction-sections -O0 -DCURL_STATICLIB -I/usr/arm-linux-gnueabihf/include
  • CXXFLAGS:std=gnu++2a -ggdb -ffunction-sections -O0 -DCURL_STATICLIB -I/usr/arm-linux-gnueabihf/include
    已尝试C++17/14/11标准,均无效;也试过cpr 1.9.7、curl 7.68.0低版本,问题依旧。

测试代码

const std::string role;
cpr::Response response = cpr::Post(cpr::Url{"192.168.1.2/login"},cpr::Payload{{role, "password"}});

已尝试的无效操作

  • 添加-static、-Bstatic、-static-libc++编译参数,无效果;
  • 尝试显式链接pthread.a失败;
  • 显式链接libcurl.a出现GLIBC相关错误;
  • 显式链接libcpr.a或同时链接libcurl.a+libcpr.a仍出现版本错误;
  • 链接/usr/lib/gcc-cross/arm-linux-gnueabihf/9/libstdc++.a,仅出现curl_mime_type未定义符号错误(未链接静态curl)。

解决建议

1. 修复工具链文件的核心错误

工具链文件存在语法错误,且根路径配置错误,修正后内容:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc-9)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

# 指定目标架构根路径,让CMake优先查找目标库和头文件
set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf)
# 禁止在主机系统查找程序、库、头文件
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

2. 强制静态链接目标架构的libstdc++

编译时添加-static-libstdc++ -static-libgcc参数,确保链接交叉编译器提供的静态libstdc++,而非动态链接主机库。可在CMake中添加:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc")

或直接在CXXFLAGS/LDFLAGS中追加该参数。

3. 修正cpr的CMake配置

CURL_LIBRARY需指定具体静态库路径而非目录,避免CMake误选动态库;确保BUILD_SHARED_LIBS=OFF生效。修改后的cmake命令:

sudo cmake -DCURL_LIBRARY=/usr/arm-linux-gnueabihf/lib/libcurl.a -DCURL_INCLUDE_DIR=/usr/arm-linux-gnueabihf/include -DCMAKE_INSTALL_PREFIX=/usr/arm-linux-gnueabihf -DCMAKE_TOOLCHAIN_FILE=/home/[username]/include/toolchain.cmake -DCPR_ENABLE_SSL=OFF -DCURL_ZLIB=OFF -DCPR_USE_SYSTEM_CURL=ON -DBUILD_SHARED_LIBS=OFF --debug-output .. 

4. 验证二进制依赖

用交叉编译工具检查生成的二进制依赖,确认是否仍链接主机库:

arm-linux-gnueabihf-readelf -d /tmp/[project name]

5. 统一交叉编译工具链环境变量

确保所有编译工具均为交叉版本,避免主机工具参与链接:

export AR=arm-linux-gnueabihf-ar
export RANLIB=arm-linux-gnueabihf-ranlib
export LD=arm-linux-gnueabihf-ld

内容的提问来源于stack exchange,提问作者13372277

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:44:59