cmake和makefile區(qū)別和cmake指定編譯器(cmake -G)

一cmake和makefile區(qū)別

要說明區(qū)別,我們先要區(qū)分下面三類工具:

1.項目構建生成工具

首先cmake是項目構建生成工具,cmake的代碼可以與平臺系統(tǒng)和編譯器無關。類似cmake的工具還有autotools、qmake、GN,其中qmake已基本由cmake替代。cmake下載地址 cmake.org.cn

也就是說cmake是用來生成makefile和其他項目生成工具配置的。

2.項目構建工具

類似make的工具有 Ninja 、nmake 、devenv(vs)。

makefile 可以理解為是make工具使用的代碼,make讀取makefile中的配置信息來實現(xiàn)編譯、鏈接和部署。

3.項目編譯鏈接工具

比如有:gcc、 cl.exe 、link 、ar

使用這些工具才能把源碼和資源編譯成執(zhí)行程序和庫。

下圖時我畫的各類工具之間的關系:


二為什么不直接使用項目編譯鏈接工具?

那為什么要有這三類工具,首先說下“項目編譯鏈接工具” 只是使用這些工具其實就能夠編譯出所有的目標,但由于命令過于復雜,編譯的流程不好控制。比如我們編譯一個執(zhí)行程序

g++ first_main.cpp -o first_main -I ../include -L../../lib -lpthread

這種方式在涉及到多個多項目、多庫、多參數(shù)和各種依賴關系是維護難度很大。還有涉及到換編譯器時,比如從g++換成clang或者cl.exe,也需要改動很多內容。

那如果換成make:

INCLUDE=-I../include

LIBS=-lpthread

first_main:first_main.o

${CC} -o $@ $< ${INCLUDE} ${LIBS}

依賴關系和所有目標都可以很清晰的管理。

三為什么不直接使用make或者Ninja

其實很多公司和項目就是直接使用make的,但make代碼規(guī)則嚴格,語法過于復雜,在做跨平臺和跨編譯器時的管理更加復雜,移植到不同環(huán)境的成本過大。這是就要引入cmake來生成make或者NInja的文件。Android 的NDK開發(fā)和鴻蒙native SDK都使用了cmake生成Ninja項目文件。

cmake本身配置就與環(huán)境和編譯器完全無關了,可以由生成時指定。

cmake編譯一個直接程序的配置也就一個函數(shù)add_executable的調用:

cmake_minimum_required(VERSION 3.20)

project(xlog)

add_executable(first_main first_main.cpp)

四cmake指定編譯器(cmake -G)

可以直接輸入,可以看到當前版本支持的編譯器

cmake -G

1.CMake支持的編譯器列表

[if !supportLists]·?[endif]Visual Studio 17 2022 = Generates Visual Studio 2022 project files.

Use -A option to specify architecture.

Visual Studio 16 2019 = Generates Visual Studio 2019 project files.

Use -A option to specify architecture.

Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.

Optional [arch] can be "Win64" or "ARM".

Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.

Optional [arch] can be "Win64" or "ARM".

Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.

Optional [arch] can be "Win64" or "ARM".

Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.

Optional [arch] can be "Win64" or "ARM".

Visual Studio 10 2010 [arch] = Deprecated. Generates Visual Studio 2010

project files. Optional [arch] can be

"Win64" or "IA64".

Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.

Optional [arch] can be "Win64" or "IA64".

Borland Makefiles = Generates Borland makefiles.

NMake Makefiles = Generates NMake makefiles.

NMake Makefiles JOM = Generates JOM makefiles.

MSYS Makefiles = Generates MSYS makefiles.

MinGW Makefiles = Generates a make file for use with

mingw32-make.

Green Hills MULTI = Generates Green Hills MULTI files

(experimental, work-in-progress).

Unix Makefiles = Generates standard UNIX makefiles.

Ninja = Generates build.ninja files.

Ninja Multi-Config = Generates build-.ninja files.

Watcom WMake = Generates Watcom WMake makefiles.

CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.

CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.

CodeBlocks - NMake Makefiles JOM

= Generates CodeBlocks project files.

CodeBlocks - Ninja = Generates CodeBlocks project files.

CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.

CodeLite - MinGW Makefiles = Generates CodeLite project files.

CodeLite - NMake Makefiles = Generates CodeLite project files.

CodeLite - Ninja = Generates CodeLite project files.

CodeLite - Unix Makefiles = Generates CodeLite project files.

Eclipse CDT4 - NMake Makefiles

= Generates Eclipse CDT 4.0 project files.

Eclipse CDT4 - MinGW Makefiles

= Generates Eclipse CDT 4.0 project files.

Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.

Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.

Kate - MinGW Makefiles = Generates Kate project files.

Kate - NMake Makefiles = Generates Kate project files.

Kate - Ninja = Generates Kate project files.

Kate - Unix Makefiles = Generates Kate project files.

Sublime Text 2 - MinGW Makefiles

= Generates Sublime Text 2 project files.

Sublime Text 2 - NMake Makefiles

= Generates Sublime Text 2 project files.

Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.

Sublime Text 2 - Unix Makefiles

= Generates Sublime Text 2 project files.

2.主要的編譯器指定示例

a. 目錄結構

first_cmake.cpp

CMakeList.txt

更換編譯器需要刪除原來的編譯緩存路徑build,或者換一個目錄生成。

b. Visual Studio 編譯器支持(生成項目文件和解決方案)

cmake -S . -B build -G "Visual Studio 17 2022"

cmake -S . -B build -G "Visual Studio 16 2019"

cmake -S . -B build -G "Visual Studio 15 2017"

cmake -S . -B build -G "Visual Studio 10 2010"

c. windows下nmake支持(vs控制臺編譯)

cmake -S . -B build -G "NMake Makefiles"

d. Ninja (安卓和鴻蒙方案)

cmake -S . -B build -G Ninja

更多編譯器資料可以進入cmake.org.cn查看官方手冊中的cmake-generators(7)內容

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容