如何通过CMake配置含C文件的Swift Framework目标属性与成员?
解决CMake生成含Swift&C的iOS Framework时的Xcode手动配置问题
问题背景
我尝试通过CMake生成Xcode项目,构建包含Swift与C文件的Framework,当前使用的CMake配置如下:
add_library(MyLibrary STATIC ${FLAT_LIBRARY_FILES}) set_target_properties(MyLibrary PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_IDENTIFIER com.MyLibrary.MyLibrary VERSION 16.4.0 SOVERSION 1.0.0 PUBLIC_HEADER MyLibrary.h DEFINES_MODULE YES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer")
执行生成命令:
cmake -G Xcode -B ./build/sdk/ios ./sdk/ios
但生成项目后,仍需手动完成以下操作才能正常构建iOS库:
- 添加iOS作为平台
- 将Swift文件添加到目标(C文件已正确添加)
- 设置
defines_module为true - 设置
swift_version - 取消勾选目标中的测试文件
- 将标头设为公开
修正后的CMake配置
# 启用Swift语言支持,CMake才能正确处理Swift文件 enable_language(Swift) # 强制指定目标平台为iOS set(CMAKE_SYSTEM_NAME iOS) # 绑定iOS SDK,确保Xcode项目默认使用iOS平台 set(CMAKE_OSX_SYSROOT iphoneos) # 指定支持的CPU架构(按需调整,如arm64真机、x86_64模拟器) set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") # 设置最低iOS部署版本(按需修改) set(CMAKE_OSX_DEPLOYMENT_TARGET 14.0 CACHE STRING "Minimum iOS deployment target") # 分离库源文件与测试文件,避免测试代码混入库目标 set(LIBRARY_SOURCE_FILES src/MyLibrary.h src/MyLibrary.c src/MySwiftFile.swift # 在此添加其他库的C/Swift源文件 ) set(TEST_SOURCE_FILES tests/MyLibraryTest.c tests/MySwiftTest.swift # 在此添加其他测试文件 ) # 创建静态Framework目标 add_library(MyLibrary STATIC ${LIBRARY_SOURCE_FILES}) set_target_properties(MyLibrary PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_IDENTIFIER com.MyLibrary.MyLibrary VERSION 16.4.0 SOVERSION 1.0.0 # 明确指定公开头文件的完整路径,避免路径解析错误 PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/MyLibrary.h" DEFINES_MODULE YES # 强制同步Xcode的defines_module属性,确保无需手动修改 XCODE_ATTRIBUTE_DEFINES_MODULE YES # 设置Swift版本(按需调整为你的项目版本) XCODE_ATTRIBUTE_SWIFT_VERSION "5.9" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer" # 指定公开头文件在Framework中的存放目录,让Xcode识别为公开头 XCODE_ATTRIBUTE_PUBLIC_HEADERS_FOLDER_PATH "Headers" ) # 设置公开头文件的包含目录,确保CMake和Xcode都能正确索引 target_include_directories(MyLibrary PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ) # 单独创建测试目标,与库目标完全分离 add_executable(MyLibraryTests ${TEST_SOURCE_FILES}) target_link_libraries(MyLibraryTests PRIVATE MyLibrary) # 标记测试目标为非默认构建,避免干扰库的构建流程 set_target_properties(MyLibraryTests PROPERTIES EXCLUDE_FROM_ALL TRUE)
配置说明(对应解决的问题)
- 添加iOS作为平台:通过
CMAKE_SYSTEM_NAME、CMAKE_OSX_SYSROOT等参数直接锁定iOS平台,生成的Xcode项目默认即为iOS目标,无需手动切换。 - 添加Swift文件到目标:先启用
Swift语言支持,再将Swift文件明确加入库的源文件列表,CMake会自动将其关联到库目标。 - 设置
defines_module为true:同时设置DEFINES_MODULE YES和XCODE_ATTRIBUTE_DEFINES_MODULE YES,强制同步Xcode项目的对应属性,消除手动修改的需求。 - 设置
swift_version:通过XCODE_ATTRIBUTE_SWIFT_VERSION直接指定Swift版本,Xcode项目会自动应用该设置。 - 取消勾选目标中的测试文件:将测试文件与库文件分离,单独创建测试目标并标记为非默认构建,测试文件不会出现在库目标的编译列表中。
- 将标头设为公开:通过
PUBLIC_HEADER指定头文件路径,配合XCODE_ATTRIBUTE_PUBLIC_HEADERS_FOLDER_PATH和target_include_directories的PUBLIC属性,确保Xcode自动将头文件识别为公开头。
内容的提问来源于stack exchange,提问作者Anton Unt
相关产品推荐
相关产品推荐

