如何在Clion的CMake C++项目中链接Gurobi求解器并修复x86_64未定义符号报错
问题根因
该错误属于C标准库运行时、ABI不匹配导致的链接符号找不到问题:报错信息中同时出现__cxx11(GCC libstdc的C11 ABI标识)和__St3__1(Clang默认libc标准库标识),说明你项目的编译配置和Gurobi预编译C++库的编译配置不一致,导致符号无法匹配。
解决方案
按以下步骤依次排查修复:
- 修正CMake标准库配置
Mac平台下官方预编译的Gurobi C库默认使用Clang的libc标准库,你需要在CMakeLists.txt的set(CMAKE_CXX_STANDARD 14)行后添加如下配置,指定项目使用同版本标准库:
如果仍存在set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")__cxx11相关的符号报错,可额外添加配置关闭GCC新ABI适配:add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) - 重新编译Gurobi C++接口适配本地编译器
如果你本地使用的编译器版本和Gurobi预编译库的编译编译器不兼容,可以手动重新生成适配的C++库:
进入Gurobi安装目录下的/library/gurobi912/mac64/src/build文件夹,在终端依次执行:
编译后生成的make clean make make installlibgurobi_c++.a会自动覆盖原有预编译版本,适配你本地的编译器配置。 - 调整库链接顺序
部分场景下链接顺序错误也会导致符号找不到,调整target_link_libraries配置,把纯C接口的gurobi91库放在C++接口库前面:target_link_libraries(gurobitest gurobi91 gurobi_c++) - 验证架构匹配
执行如下命令检查Gurobi库是否支持x86_64架构:
输出包含lipo -info /library/gurobi912/mac64/lib/libgurobi_c++.a lipo -info /library/gurobi912/mac64/lib/libgurobi91.dylibx86_64则架构适配正常,如果你使用的是Apple Silicon系列芯片,需要开启Clion的Rosetta兼容模式运行,或升级到支持arm64架构的Gurobi版本。
内容的提问来源于stack exchange,提问作者Bertram Li
相关产品推荐
相关产品推荐

