CMake生成Xcode项目Swift-C++互操作编译参数报错咨询
问题原因及解决办法
核心问题在于:CMake把Swift专属的编译选项错误传递给了C++编译器。
具体细节:
- 当你在同一个CMake目标中同时包含Swift和C文件时,CMake会将你设置的目标级编译选项,分发给该目标用到的所有编译器——也就是处理C的clang,和处理Swift的swiftc。
-cxx-interoperability-mode=default是Swift编译器(swiftc)独有的参数,C++编译器clang完全不识别这个选项,因此会抛出unknown argument: '-cxx-interoperability-mode=default'的错误。- 拆分到不同库时,C++库目标仅由clang编译,不会接触到这个Swift专属参数;Swift目标单独由swiftc编译,参数正常生效,所以不会报错。
修复方法
不要给混合目标设置全局编译选项,而是用CMake的生成器表达式$<COMPILE_LANGUAGE:Swift>,仅将该参数传递给Swift编译器:
target_compile_options(YourTarget PRIVATE $<$<COMPILE_LANGUAGE:Swift>: -cxx-interoperability-mode=default> )
这样CMake会自动判断编译语言,只在处理Swift文件时传入这个参数,C++编译环节会跳过它,自然就不会报错了。
官方文档可能默认用户针对纯Swift目标配置选项,或者默认用户了解按语言区分编译选项的技巧,所以没特意提及混合目标的特殊处理场景。
内容的提问来源于stack exchange,提问作者Vipul Gupta
相关产品推荐
相关产品推荐

