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)
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView

浙公网安备 33010602011771号