Github Action在Mac arm64架构构建失败,Windows/Linux正常
我通过Github Action构建Godot 3程序的依赖库,依赖从Conan Center拉取。该流程在插件作者的示例项目中可正常运行,但引入TagLib库并在代码中调用后,仅Ubuntu和Windows平台构建成功,Mac平台始终失败。已排查构建日志并消除所有错误和警告,问题仍存在,最终报错如下:
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libVeles.dylib] Error 1
make[1]: *** [CMakeFiles/Veles.dir/all] Error 2
make: *** [all] Error 2
Error: Process completed with exit code 2.
可能的原因及解决步骤
TagLib的Conan包架构不匹配:检查Conan拉取的TagLib包是否支持arm64架构。Mac平台下Conan可能默认拉取x86_64版本,导致链接时缺失arm64符号。可在Conan命令中明确指定架构:
conan install . --settings=os=Macos --settings=arch=arm64也可在
conanfile.txt/conanfile.py的settings字段中配置,确保arm64架构被正确识别。CMake架构配置缺失:确认CMakeLists.txt中是否针对Mac arm64做了适配,比如设置
CMAKE_OSX_ARCHITECTURES为arm64,或者在Github Action的Mac构建任务中传递正确的架构参数。符号导出问题:检查代码中调用TagLib的部分,是否因编译选项(如
-fvisibility=hidden)、命名空间限制导致符号未被暴露给链接器。可尝试在CMake中添加-fvisibility=default强制导出符号,或核对TagLib头文件的导出宏是否正确使用。Github Action Runner架构不匹配:确认Mac runner的架构类型(Github提供x86_64和arm64两种),若用x86_64 runner构建arm64产物,需配置交叉编译模式,确保Conan和CMake都适配交叉编译流程。
TagLib Conan包兼容性问题:尝试切换TagLib的Conan包版本,或放弃预编译包,改用源码编译TagLib,验证是否能解决架构不兼容问题。
内容的提问来源于stack exchange,提问作者LyffLyff

