簡體   English   中英

如何在構建目錄中使用 CMake 文件 (GLOB SRCS *. )

[英]how to use CMake file (GLOB SRCS *. ) with a build directory

這是我當前的 CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.3)
set(CMAKE_C_FLAGS " -Wall -g ")
project( bmi )
file( GLOB SRCS *.cpp *.h )
add_executable( bmi ${SRCS}) 

這是從我的源目錄構建的,但之后我必須清理所有額外的文件。 我的問題是,如果我的所有源文件都在同一個源目錄中,我如何從構建目錄構建它?

謝謝

如果你真的需要使用 file(GLOB ...),這個 CMakeLists.txt 應該可以工作:

cmake_minimum_required(VERSION 3.3)
project(bmi)
add_definitions("-Wall" "-g")
include_directories(${PROJECT_SOURCE_DIR})
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
add_executable(bmi ${SRC_FILES})

在這種情況下,每次添加或刪除源文件時,您都必須從構建目錄啟動 cmake:

cmake <your_source_dir> -G <your_build_generator>

正如 Phil 所提醒的,CMake 文檔不建議使用 GLOB。 但也有一些例外。 您將獲得有關此帖子的更多信息。

如果您沒有遇到這些例外情況,您寧願列出源文件而不是使用 GLOB :

set(SRC_FILES ${PROJECT_SOURCE_DIR}/main.cpp
              ${PROJECT_SOURCE_DIR}/bmi.cpp
              … )

注意:如果您在 .cpp 文件中有 #include 的 .h 文件,我認為沒有任何理由將它們放在 add_executable 中,您只需要使用 include_directories 指定包含目錄。

如果 CMakeLists.txt 自上次 cmake 運行后發生更改,或者如果 cmake 再次用於配置項目,Cmake 過去只會更新源文件列表。

在 cmake 3.11.0 中添加了遞歸搜索和添加或刪除源文件的自動重新配置。 從那時起,您可以使用以下代碼段:

if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.11.0")
    file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS *.cpp *.h)
else()
    file(GLOB SOURCE_FILES *.cpp *.h */*.h */*.cpp)
endif()

else() 之后的 file() 命令至少提供了一點向后兼容性:它仍然在當前文件夾及其直接子文件夾中搜索源文件。 但它不會自動識別是否有新文件或舊文件已被刪除。

請注意,VERSION_GREATER_EQUAL 僅在 cmake >= 3.7 中可用

這不是您問題的答案,但是我無法在評論中正確設置其格式。 cmake文檔

注意:我們不建議您使用GLOB從源代碼樹中收集源文件列表。 如果在添加或刪除源時沒有CMakeLists.txt文件更改,則生成的生成系統無法知道何時要求CMake重新生成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM