如何编译_GLIBCXX_USE_CXX11_ABI=0的OR-Tools与libtorch同CMake项目共存
解决方案
你遇到的是典型的C++ ABI不兼容问题,根因是libtorch和OR-Tools使用了不同的_GLIBCXX_USE_CXX11_ABI配置编译,导致符号不匹配或者内存布局不一致。以下是两种可落地的解决方法:
方案1(推荐,改动最小):使用C++11 ABI版本的libtorch
PyTorch官方提供了适配新ABI的预编译包,直接替换你的libtorch版本即可:
- 下载对应版本的C++11 ABI版libtorch(下载时注意选择cxx11 ABI版本,而非pre-cxx11 ABI版本)
- 删除你CMake配置中的
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)一行 - 清空原有build目录,重新编译运行即可
此时libtorch和OR-Tools都使用默认的新ABI编译,不存在兼容问题,既不会出现链接错误,也不会有运行时崩溃。
方案2:强制OR-Tools全链路使用旧ABI编译
如果你必须使用pre-cxx11 ABI版本的libtorch,需要确保OR-Tools及其所有依赖(absl、protobuf等)都使用相同的旧ABI编译,修改你的link_or_tools_to_target函数即可:
function(link_or_tools_to_target) set(options) set(args TARGET BINARY) set(list_args) cmake_parse_arguments( PARSE_ARGV 0 "ARG" "${options}" "${args}" "${list_args}" ) foreach(arg IN LISTS ARG_UNPARSED_ARGUMENTS) message(WARNING "Unparsed argument: ${arg}") endforeach() # 强制所有子项目继承旧ABI配置,覆盖子项目默认设置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0" CACHE INTERNAL "" FORCE) # Build OR-tools dependencies. set(BUILD_DEPS ON) # Disable SCIP solver. set(USE_SCIP OFF) # Add or-tools as a subdirectory and create the alias ortools::ortools. add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/or-tools") # Link or-tools to the target. target_link_libraries(${ARG_TARGET} PRIVATE ortools::ortools) endfunction()
修改完成后清空整个build目录,重新生成编译即可。
问题根因解释
- 你之前全局添加
_GLIBCXX_USE_CXX11_ABI=0时,该配置仅作用于你自己写的代码目标,OR-Tools的子项目依赖(如absl)没有继承到该配置,仍用新ABI编译,两种ABI的代码内存布局不一致,导致absl静态初始化阶段访问空指针崩溃。 - 你删除ABI配置时,你自己的代码会继承libtorch的
TORCH_CXX_FLAGS中的旧ABI配置,而OR-Tools用新ABI编译,两者的符号名规则不同,所以链接时找不到OR-Tools的对应符号。
内容的提问来源于stack exchange,提问作者Theophile Champion
相关产品推荐
相关产品推荐

