在cmakelist中不编译某个文件

在 CMake 中,如果你想让某个源文件不被编译,有多种方法可以实现。以下是常见的几种方式:


1. 从目标的源文件列表中移除

CMake 中,源文件通常在 add_executable 或 add_library 中被添加。只需不将特定文件添加到这些命令中即可。

示例:

set(SOURCES
    main.cpp
    file1.cpp
    file2.cpp
)

# 从源文件列表中移除 file2.cpp
list(REMOVE_ITEM SOURCES file2.cpp)

add_executable(MyApp ${SOURCES})

2. 使用条件控制文件的编译

通过设置条件来控制是否包含某个文件。

示例:

set(USE_FILE2 OFF) # 控制开关

set(SOURCES
    main.cpp
    file1.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(SOURCES
    main.cpp
    file1.cpp
    file2.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)以保证项目的可维护性。
posted @ 2025-02-03 16:32  海_纳百川  阅读(309)  评论(0)    收藏  举报
本站总访问量