背景
环境:
- macOS 14
- MacBook Pro M3
ld: symbol(s) not found for architecture arm64 错误原因总结
编译错误1
在macOS上进行C++开发,有时会遇到以下报错:
Undefined symbols for architecture arm64:
"CameraRawWidget::eventFilter(QObject*, QEvent*)", referenced from:
vtable for CameraRawWidget in mocs_compilation.cpp.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
这个错误信息,让人很茫然,很容易被ld: symbol(s) not found for architecture arm64
误导,而且很多编译错误也会出现这行话。实际上的真实原因,可能跟ARM架构毫无关系。
故总结一下可能的原因:
原因一
函数未定义。即,如果没有实现函数的定义,也会报这个错误。
原因二
使用的库未链接。当使用某个库时,代码里调用了,但CMake里没进行链接,引用这个库,也会报这个错误
原因三
CMake 缓存未刷新,导致没索引到这个文件,从而找不到定义。刷新一下CMake即可。
编译错误2
Undefined symbols for architecture arm64:
"_main", referenced from:
<initial-undefines>
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
这里有个关键点_main
,排查CMakeLists.txt,发现使用add_executable()
创建可执行文件项目,但没有main.cpp
,所以问题很清晰了。解决方案也很简单,创建main.cpp
, 或者改为add_library()
,即可编译成功
总结
目前已记录的已知原因如上,后续遇到继续更新。