[英]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.