libprotobuf.so出现未定义符号

libprotobuf.so再gcc4.8.5环境编译,然后再高版本gcc环境编译连接这个libprotobuf.so,之后,出现未定义符号,因为

  • protobuf 用 GCC 4.8.5 编译 → 默认使用旧 C++ ABI(_GLIBCXX_USE_CXX11_ABI=0
  • libGitcJni.so 用 GCC 10.3.1 编译 → 默认使用新 C++ ABI(_GLIBCXX_USE_CXX11_ABI=1

GCC 5.1 开始默认启用了 C++11 ABI,导致 std::string 的符号名称不同。

 

所以编译libGitcJni时要加上add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

makefilelist.txt文件如下

AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR} SRC)

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/jni)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gitc)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gitc/common_header)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gitc/common_header/hva_header)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/gitc/lib_header)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# ===== 关键修改:强制使用旧 C++ ABI =====
#protobuf 用 GCC 4.8.5 编译 → 默认使用旧 C++ ABI(_GLIBCXX_USE_CXX11_ABI=0)
#libGitcJni.so 用 GCC 5.1 以上的编译 → 默认使用新 C++ ABI(_GLIBCXX_USE_CXX11_ABI=1)
#GCC 5.1 开始默认启用了 C++11 ABI,导致 std::string 的符号名称不同。编译会报错,所以强制设置参数_GLIBCXX_USE_CXX11_ABI
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/bin $ORIGIN)

add_library(GitcJni SHARED ${SRC})

# 针对 GitcJni 目标单独设置 ABI(推荐方式)
target_compile_definitions(GitcJni PRIVATE _GLIBCXX_USE_CXX11_ABI=0)

TARGET_LINK_LIBRARIES(GitcJni safefunc HIK_GIR_MDL_CMP HIK_GITC_atlas300vpro protobuf)

 

posted @ 2026-07-16 16:20  一字千金  阅读(4)  评论(0)    收藏  举报