簡體   English   中英

遞歸 CMake 搜索頭文件和源文件

[英]Recursive CMake search for header and source files

我是 CMake 的新手,想問問是否有人可以幫助解決以下問題。

我在各自的文件夾中有 C++ 源文件和頭文件,現在,我想制作一個遞歸搜索它們的 CMake 文本文件。

目前,我是這樣做的:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(CarDetectorDAISY)

file(GLOB_RECURSE SRCS *.cpp)
file(GLOB_RECURSE HDRS *.h)

ADD_EXECUTABLE(stereo_framework  ${SRCS} ${HDRS})
TARGET_LINK_LIBRARIES(stereo_framework) 

這會創建我的CarDetectorDAISY.sln解決方案文件,當我嘗試構建它時,它顯示找不到頭文件的錯誤(沒有這樣的文件或目錄)。

如果有人可以幫助我,我將不勝感激。 謝謝。

您可能錯過了一個或多個include_directories調用。 add_executable調用add_executable頭添加到文件列表中實際上並沒有添加到編譯器的搜索路徑 - 這是一個方便的功能,因此它們只會添加到 IDE 中的項目文件夾結構中。

因此,在您的根目錄中,假設您有 /my_lib/foo.h,並且您希望將其作為源文件包含在

#include "my_lib/foo.h"

然后在您的 CMakeLists.txt 中,您需要執行以下操作:

include_directories(${CMAKE_SOURCE_DIR})

如果,相反,您只想做

#include "foo.h"

然后在 CMakeLists.txt 中,做

include_directories(${CMAKE_SOURCE_DIR}/my_lib)


我應該提到file(GLOB...)不是收集源列表的推薦方法 - 您實際上應該在 CMakeLists.txt 中明確添加每個文件。 通過這樣做,如果您稍后添加或刪除源文件,CMakeLists.txt 將被修改,並且 CMake 會在您下次嘗試構建時自動重新運行。 file的文檔:

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

我的回答主要是一個 hack,但如果您不想手動添加所有目錄,我發現它很有用。

此宏將遞歸掃描所有子目錄(及其子目錄等...)。 如果目錄包含頭 (.h) 文件,則它將其路徑附加到return_list 然后可以將此列表與target_include_directories一起使用。

MACRO(HEADER_DIRECTORIES return_list)
    FILE(GLOB_RECURSE new_list *.h)
    SET(dir_list "")
    FOREACH(file_path ${new_list})
        GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
        SET(dir_list ${dir_list} ${dir_path})
    ENDFOREACH()
    LIST(REMOVE_DUPLICATES dir_list)
    SET(${return_list} ${dir_list})
ENDMACRO()

用法:

HEADER_DIRECTORIES(header_dir_list)

list(LENGTH header_dir_list header_dir_list_count)
message(STATUS "[INFO] Found ${header_dir_list_count} header directories.")

target_include_directories(
    my_program
    PUBLIC
    ${header_dir_list} # Recursive
)

宏觀信用:克里斯托夫

用 Cmake 3.10 測試

只是為了進一步澄清弗雷澤的回答中的一點:

不應將標頭傳遞給ADD_EXECUTABLE

原因是,例如,Linux 上的預期編譯命令只是:

gcc main.c mylib.c

而不是:

gcc main.c mylib.c mylib.h

C 預處理器然后解析mylib.c ,並看到一個#include "mylib.h" ,並使用它的搜索路徑來查找這些文件。

通過使用include_directories ,我們改為修改 cpp 預處理器搜索路徑,這是正確的方法。 在 GCC 中,這意味着將-I標志添加到命令行:

gcc -Inew/path/to/search/for/headers main.c mylib.c

暫無
暫無

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

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