CMAKE學習 編譯多個檔案 多個目錄

2021-10-23 01:26:18 字數 1598 閱讀 1362

大型工程會有很多檔案,包括類的實現和定義,各種不同的模組交叉在一起,我們怎麼用cmake方便的編譯呢?

例如有這麼乙個工程:

我們現在想要編譯的話,如果只選擇了main.cpp,則會提示」未定義的引用「,因為我們標頭檔案和實現分離,但我們只包含了標頭檔案,所以是一定找不到實現的。我們這時候就要把所有原始檔都新增到add_executable中:

儲存以後使用cmake .  &  make  就可以完成一次perfect的編譯過程了。

但是問題又來了,假如我們的工程很大,需要很多個cpp檔案,總不能乙個乙個新增吧,對於這種情況 ,cmake提供了乙個能夠自動獲取當前目錄下所有cpp的函式:

aux_source_directory(目錄  存放檔案列表的變數)

例如我們想搜尋當前目錄下的所有cpp則為

aux_source_directory(. cpp_list)

但是這個命令只會僅僅搜尋當前目錄下的檔案(即tool2.cpp),tool1目錄中無法搜尋到,有兩種解決辦法:

1:再增加乙個aux_source_directory(./tool1 cpp_list2),即可成功編譯

2.使用cmake單獨將tool1資料夾編譯為乙個so

具體步驟:

1.在tool1資料夾中新建乙個cmakelists.txt ,其中內容為:

aux_source_directory(. tool1_file) #查詢當前目錄下的tool1相關檔案

add_library(tool1lib $) #將他們編譯為乙個叫tool1lib的檔案

2.主目錄的cmakelists修改為:

cmake_minimum_required(version 2.6)  #指定cmake最低版本為2.6

project(firstcmakedemo) #指定工程名稱

aux_source_directory(. cpp_list) #搜尋當前目錄下的所有cpp檔案

add_subdirectory(tool1) #將tool1資料夾加入子目錄,這樣他就可以去tool1資料夾中查詢編譯

add_executable(out_file $) #生成目標檔案

target_link_libraries(out_file tool1lib)

#新增鏈結庫,其庫的名字由tool1資料夾中的cmakelists.txt來指定生成

寫好儲存以後,在根目錄執行cmake .  & make,即可自動編譯.a靜態庫+鏈結程式了。

編譯多個檔案

假設我們寫了乙個foo.h的標頭檔案,如下 ifndef foo h define foo h namespace m1 endif include include foo.h 這裡一定要打雙引號,因為它不是標準標頭檔案。void m1 foo 最後,我們在寫乙個main.c檔案來呼叫它 inclu...

CMake學習 一 多個原始檔和目錄

這裡只是我記錄和整理一下,原文請點這裡 demo2 main.cc mathfunctions.cc mathfunctions.h編寫cmakelists.txt cmake 最低版本號要求 cmake minimun version version 2.8 專案資訊 project demo2 ...

linux下編譯多個檔案

例如 home files資料夾下有檔案main.c home files common資料夾下有檔案tou.h和shixian.c。tou.h為 若有多個shixian檔案,比如shixian1.c,shixian2.c,都可以在tou.h中用extern宣告出來。shixian.c為 編譯時用命...