使用target_sources时CMake文件属性丢失,如何保留CUDA编译属性?
解决CMake中target_sources添加源文件后CUDA语言属性不生效的问题
问题核心是源文件路径不匹配:在子目录中通过target_sources添加相对路径的源文件时,CMake会将其解析为相对于子目录的绝对路径;若set_source_files_properties使用的是相对于顶层目录的路径,两者无法匹配,导致语言属性无法应用到目标文件上。
以下是两种可靠的解决方法:
方法一:使用绝对路径统一文件引用
在子目录中添加源文件时,明确使用绝对路径,确保set_source_files_properties引用的路径与target_sources完全一致:
# 子目录的CMakeLists.txt # 拼接distribution.cpp的绝对路径,假设文件位于顶层src目录下 set(DIST_FILE "${CMAKE_SOURCE_DIR}/src/distribution.cpp") # 向目标添加源文件 target_sources(foo PRIVATE ${DIST_FILE}) # 条件设置CUDA语言属性 if(CUDA_FOUND) set_source_files_properties(${DIST_FILE} PROPERTIES LANGUAGE CUDA) endif()
方法二:在子目录中直接处理相对路径
如果distribution.cpp位于当前子目录下,直接使用子目录内的相对路径即可,此时target_sources和set_source_files_properties的路径会自动匹配:
# 子目录的CMakeLists.txt # 直接使用子目录内的相对路径 set(DIST_FILE distribution.cpp) target_sources(foo PRIVATE ${DIST_FILE}) if(CUDA_FOUND) set_source_files_properties(${DIST_FILE} PROPERTIES LANGUAGE CUDA) endif()
额外注意事项
- 确保已通过
enable_language(CUDA)启用CUDA语言支持(CMake 3.10+推荐方式),否则CUDA_FOUND标志可能无法正确触发。 - 避免混用相对路径和绝对路径,始终保持源文件引用路径的一致性,这是CMake中设置源文件属性的关键前提。
内容的提问来源于stack exchange,提问作者JakeTuero
相关产品推荐
相关产品推荐

