使用cmake來生成makefile

2021-08-01 19:42:46 字數 2476 閱讀 9469

cmake 提供了比 autoconfig 更簡潔的語法

在 linux 平台下使用 cmake 生成 makefile 並編譯的流程如下:

編寫cmakelists.txt執行命令cmake path或者ccmake path生成makefile ( pathcmakelists.txt所在的目錄)

使用make命令進行編譯。

cmakelists.txt 需要手工編寫,也可以通過編寫指令碼進行半自動的生成

現假設我們的專案中只有乙個原始檔main.cpp

清單 1 原始檔 main.cpp

1 #include2 

3 int main()

4 )

cmakelists.txt 的語法比較簡單,由命令、注釋和空格組成,其中命令是不區分大小寫的,符號"#"後面的內容被認為是注釋。命令由命令名稱、小括號和引數組成,引數之間使用空格進行間隔。例如對於清單2的 cmakelists.txt 檔案:第一行是一條命令,名稱是 project ,引數是 main ,該命令表示專案的名稱是 main 。第二行的命令限定了 cmake 的版本。第三行使用命令 aux_source_directory 將當前目錄中的原始檔名稱賦值給變數 dir_srcs 。 cmake 手冊中對命令 aux_source_directory 的描述如下:

aux_source_directory()
該命令會把引數 中所有的原始檔名稱賦值給引數 。 第四行使用命令 add_executable 指示變數 dir_srcs 中的原始檔需要編譯 成乙個名稱為 main 的可執行檔案。

完成了檔案 cmakelists.txt 的編寫後需要使用 cmake 或 ccmake 命令生成makefile 。 ccmake 與命令 cmake 的不同之處在於 ccmake 提供了乙個圖形化的操作介面。cmake 命令的執行方式如下:

cmake [options]
這裡我們進入了 main.cpp 所在的目錄後執行 「cmake .」 後就可以得到 makefile 並使用 make 進行編譯,如下圖所示。

cmake處理源**分布在不同目錄中的情況也十分簡單。現假設我們的源**分布情況如下:

圖 2. 源**分布情況

在目錄 step2 中建立檔案 cmakelists.txt 。檔案內容如下:

清單 3 目錄 step2 中的 cmakelists.txt

1 project(main)

2 cmake_minimum_required(version 2.6)

3 add_subdirectory( src )

4 aux_source_directory(. dir_srcs)

5 add_executable(main $  )

6 target_link_libraries( main test )

相對於清單 2,該檔案新增了下面的內容: 第三行,使用命令 add_subdirectory 指明本專案包含乙個子目錄 src 。第六行,使用命令 target_link_libraries 指明可執行檔案 main 需要連線乙個名為test的鏈結庫 。

在子目錄 src 中建立 cmakelists.txt。檔案內容如下:

清單 4. 目錄 src 中的 cmakelists.txt

1 aux_source_directory(. dir_test1_srcs)

2 add_library ( test $)

在該檔案中使用命令 add_library 將 src 目錄中的原始檔編譯為共享庫。

至此我們完成了專案中所有 cmakelists.txt 檔案的編寫,進入目錄 step2 中依次執行命令 「cmake .」 和 「make」 得到結果如下:

圖3. 處理多源檔案目錄時 cmake 的執行結果

使用CSC命令來生成專案

本篇部落格來演示如何通過csc命令來生成程式集和應用程式,而不使用visualstudio。編譯c 使用的是csc命令,該命令位於c windows microsoft.net framework64 v4.0.30319目錄下,如果你的控制台提示找不到csc命令,則需要將該路徑加入到系統的環境變數...

使用Rex來生成字串陣列

我們在專案中,經常要使用正規表示式,現在有乙個工具可以按正規表示式生成資料.正規表示式的語法忘記了嗎?看這兒.如果你熟悉正規表示式 具體用法可以在cmd下執行便可以看到用法,這個是.net的程式.我們可以引用它,然後用下面的code來生成我們想要的字串陣列.1 2 generates the tes...

用jxl來生成Excel

file file new file xx xx xls if file.getparentfile exists workbook wb null 用來獲取工作簿 writableworkbook wwb null 建立工作簿 writablesheet sheet0 null sheet if ...