大型工程會有很多檔案,包括類的實現和定義,各種不同的模組交叉在一起,我們怎麼用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為 編譯時用命...