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

如何编译_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版本即可:

  1. 下载对应版本的C++11 ABI版libtorch(下载时注意选择cxx11 ABI版本,而非pre-cxx11 ABI版本)
  2. 删除你CMake配置中的add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)一行
  3. 清空原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:30:01