在 CMake 中,如果你想让某个源文件不被编译,有多种方法可以实现。以下是常见的几种方式:
1. 从目标的源文件列表中移除
CMake 中,源文件通常在 add_executable
或 add_library
中被添加。只需不将特定文件添加到这些命令中即可。
示例:
set(SOURCESmain.cppfile1.cppfile2.cpp
)# 从源文件列表中移除 file2.cpp
list(REMOVE_ITEM SOURCES file2.cpp)add_executable(MyApp ${SOURCES})
2. 使用条件控制文件的编译
通过设置条件来控制是否包含某个文件。
示例:
set(USE_FILE2 OFF) # 控制开关set(SOURCESmain.cppfile1.cpp
)if(USE_FILE2)list(APPEND SOURCES file2.cpp)
endif()add_executable(MyApp ${SOURCES})
将 USE_FILE2
设置为 ON
时才会编译 file2.cpp
。
3. 设置特定文件的编译选项禁用
如果不希望完全移除文件,而只是暂时禁止其被编译,可以使用目标属性 EXCLUDE_FROM_ALL
或 SKIP_PRECOMPILE_HEADERS
。
示例:
set_source_files_properties(file2.cpp PROPERTIES EXCLUDE_FROM_ALL TRUE)
这样 file2.cpp
会被忽略,但文件仍然保留在项目中。
4. 使用目标的子目录隔离
如果需要更精确地控制某个文件的编译,可以通过子目录或分组的方式来隔离。
示例:
# 主 CMakeLists.txt
add_subdirectory(src)# src/CMakeLists.txt
set(SOURCESmain.cppfile1.cppfile2.cpp
)# 排除 file2.cpp
list(REMOVE_ITEM SOURCES file2.cpp)add_executable(MyApp ${SOURCES})
5. 使用 set_target_properties
排除
可以通过目标属性控制文件是否参与构建。
示例:
add_executable(MyApp main.cpp file1.cpp file2.cpp)# 排除 file2.cpp
set_source_files_properties(file2.cpp PROPERTIES HEADER_FILE_ONLY TRUE)
6. 动态生成 CMake 文件
如果你的项目需要更复杂的控制,可以动态生成一个包含目标定义的 CMake 文件,并在条件满足时进行调用。
示例:
if(SOME_CONDITION)include(files_to_build.cmake)
endif()
推荐方式
- 如果仅仅是临时排除文件,使用 移除文件列表(方法 1 或 2) 是最简单直接的。
- 如果是复杂项目,建议结合条件控制(方法 2)和分组管理(方法 4)以保证项目的可维护性。