M1 Mac g++编译Gurobi C++程序报arm64架构符号未找到错误
问题概述
- 设备环境:M1芯片(arm64架构)MacBook,C++编译新手
- 初始手动编译命令:
g++ -I/Library/gurobi950/macos_universal2/include -L/Library/gurobi950/macos_universal2/lib model.cpp -lgurobi_c++ - 触发报错:
ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
- 补充测试:追加
-o main -m64 -g -Wall参数后执行编译,依旧抛出相同错误 - 特殊现象:同一份代码通过项目Makefile编译可正常运行,仅终端手动输入编译命令时触发报错
排查解决步骤
按优先级从高到低排查:
- 补全缺失的链接库
你当前命令仅链接了gurobi_c++这个C++封装库,该库依赖Gurobi核心C运行库,必须追加对应版本的核心库链接参数-lgurobi95(和你安装的9.5.0版本对应)。Makefile能正常编译,大概率是配置里写全了两个依赖库,手动输命令时漏了核心库。
修正后的参考命令:g++ -o main -m64 -g -Wall -I/Library/gurobi950/macos_universal2/include -L/Library/gurobi950/macos_universal2/lib model.cpp -lgurobi_c++ -lgurobi95 - 核对参数顺序
clang/g对编译参数顺序有严格要求:源文件必须放在所有依赖库之前,库的顺序也要满足依赖关系——上层依赖库写在前面,底层被依赖库写在后面。也就是-lgurobi_c++(C封装层)必须放在-lgurobi95(核心C库)前面,顺序写反也会报符号找不到的错误。 - 校验架构匹配
执行arch命令查看当前终端运行的架构:- 如果输出为
x86_64,说明终端跑在Rosetta 2转译模式下,需要在编译命令中追加-arch arm64强制指定编译为arm64架构,或者将终端切换为原生arm64模式后再编译 - 如果输出为
arm64,执行file /Library/gurobi950/macos_universal2/lib/libgurobi95.dylib检查库文件的支持架构,确认输出内容中包含arm64标识
- 如果输出为
- 快速定位差异
既然Makefile可以正常编译,直接在Makefile所在目录执行make -n,该命令会打印Makefile实际执行的完整编译链接命令,将打印出的命令和你手动输入的命令逐字符对比,就能直接找到遗漏的参数或配置差异。
内容的提问来源于stack exchange,提问作者orpanter
相关产品推荐
相关产品推荐

