CMake混合C++与汇编ASM函数项目构建报错如何解决
问题原因
1. Undefined symbol: foo(int, int) 报错原因
- 符号不匹配:C++ 默认会对函数做名称修饰(Name Mangling),你在
main.cpp中声明的int foo(int, int)没有加extern "C"修饰,编译器生成的符号引用是经过修饰的C++风格符号(类似__Z3fooii),和汇编代码中定义的纯C风格符号_foo无法匹配。 - 架构不匹配:你提供的汇编代码是x86_64架构的AT&T语法,如果你的设备是Apple Silicon(M系列芯片)的Mac,Xcode默认编译目标为arm64架构,该段汇编无法被识别,且对应调用约定也不匹配。
2. Error: could not load cache 报错原因
路径使用错误:cmake .. -G Xcode 是在build目录下执行,生成的CMakeCache.txt存放在build目录中。你在终端执行cmake --build ..时,会向上一级目录查找缓存文件,自然无法找到。
解决方法
1. 修复符号不匹配问题
修改main.cpp中的foo函数声明,添加extern "C"标识,告诉编译器用C语言的规则处理符号,不要做名称修饰:
// 修改前 int foo(int x, int y); // 修改后 extern "C" int foo(int x, int y);
2. 修复架构不匹配问题
二选一即可:
- 如果你要保留现有x86_64汇编,生成Xcode项目时指定架构为x86_64:
cmake .. -G Xcode -DCMAKE_OSX_ARCHITECTURES=x86_64 - 如果你要适配Apple Silicon的arm64架构,修改
foo.s为arm64版本的汇编:.text .globl _foo _foo: add x0, x0, x1 // 前两个参数存放在x0、x1寄存器,相加后存入x0 ret // arm64调用约定下x0为返回值寄存器,直接返回即可
3. 修复CMake缓存加载错误
调整构建命令的路径即可:
- 如果你在build目录内执行构建,命令为:
cmake --build . - 如果你在项目根目录执行构建,命令为:
cmake --build build
内容的提问来源于stack exchange,提问作者k.makarov
相关产品推荐
相关产品推荐

