cmake入門篇--多文件編譯

 

cmake相關鏈接

cmake門口觀望篇-單文件編譯


目錄

1 多文件編譯-單個目錄下

aux_source_directory 將制定路徑下所有源文件保存到變量

2 多文件不在同一目錄

2.1 不使用鏈接庫

include_directories 添加頭文件路徑

2.2 使用動態鏈接庫

add_subdirectory 添加外部路徑

add_library 用指定文件編譯庫文件

2.3 使用靜態鏈接庫


1 多文件編譯-單個目錄下

單個目錄下多文件比較簡單,只需要在單文件編譯基礎上,把所有文件添加到add_executable()源文件列表即可,下面舉個例子說明

文件結構如下,其中buil是外部構建時使用的,用來放構建文件,使源文件與構建文件隔離,關於外部構建單文件編譯中有提到

dawn@DAWN-AMD:~/workstation/cmaketest$ tree
.
├── CMakeLists.txt
├── build
├── main.c
├── sayhello.c
└── sayhello.h

文件內容:

./CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8)
    project(CMakeTest)
    add_executable(cmaketest sayhello.c main.c)

./main.c:
	#include"sayhello.h"
	int main()
	{
	    sayhello();
	}
./sayhello.c:
	#include"sayhello.h"
	void sayhello()
	{
	    printf("hello CMake !\n");
	}
	
./sayhello.h:
	#include<stdio.h>
	void sayhello(void);

然後執行cmake . && make就可以編譯出可執行程序cmaketest

aux_source_directory 將指定路徑下所有源文件保存到變量

但是當有很多文件時,一個一個寫到add_executable裏顯然是很麻煩的事,我們可以藉助aux_source_directory實現將整個目錄下所有源文件加到工程,具體用法:

aux_source_directory(<dir> <variable>)

該命令會將指定目錄下的所有源文件保存存到指定變量名中。於是上面的CMakeLists.txt可以簡寫成

./CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8)
    project(CMakeTest)
    aux_source_directory(. all_src)
    add_exEcutablE(cmaketest ${all_src})

 aux_source_directory(. all_src) 將"."目錄(當前CMakeLists.txt所在目錄)下的所有源文件保存到all_src變量中

2 多文件不在同一目錄

將上面的例子中的sayhello.c 和 sayhello.h放到sayhello目錄下

.
├── CMakeLists.txt
├── build
├── main.c
└── sayhello
    ├── sayhello.c
    └── sayhello.h

我們還是遵從由淺入深原則,逐步提升,首先在上個例子的CmakeList裏修改

2.1 不使用鏈接庫

cmake_minimum_required(VERSION 2.8)
project(CMakeTest)
include_directories("./sayhello")
aux_source_directory(./sayhello sayhello_src)
add_executable(cmaketest ${sayhello_src} main.c)

include_directories 添加頭文件路徑

這裏我們比前面多了一個指令include_directories, 這個指令用於添加頭文件查找路徑,類似於Makefile裏的-I$(inclidedir)選項, 用於工程查找#include包含的頭文件,如果不加這一句構建時不會報錯,但編譯時會提示找不到頭文件

上面的方式不使用鏈接庫,只需要一個CMakeLists.txt便可完成,但所有的模塊都放在一個文件裏管理不利於模塊化編程,適用於較小的工程,當工程較大,且模塊間相對獨立時,往往使用鏈接庫的形式,

2.2 使用動態鏈接庫

下面我們將sayhello編成動態庫libsayhello.so,在根目錄鏈接動態庫,此時需要在sayhello目錄下添加一個cmake構建文件CMakeLists.txt,目錄結構如下所示

.
├── CMakeLists.txt
├── build
├── main.c
└── sayhello
    ├── CMakeLists.txt
    ├── sayhello.c
    └── sayhello.h

根目錄下的. CMakeLists.txt

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(CMakeTest)
include_directories("./sayhello")
aux_source_directory(./ main_src)
add_subdirectory(sayhello)
add_executable(cmaketest ${main_src})
target_link_libraries(cmaketest sayhello)

 接下來cd到build目錄即可進行外面構建和編譯,可以看到在build路徑下生成了可執行文件和動態庫,當然,這個安裝路徑我們可以在CMakeLists.txt指定 

dawn@DAWN-AMD:~/workstation/cmaketest$ cd build/
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cmake && make
dawn@DAWN-AMD:~/workstation/cmaketest$ tree -L 3
.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── cmaketest
│   └── sayhello
│       ├── CMakeFiles
│       ├── Makefile
│       ├── cmake_install.cmake
│       └── libsayhello.so
├── main.c
└── sayhello
    ├── CMakeLists.txt
    ├── sayhello.c
    └── sayhello.h

這裏用了兩個指令,

add_subdirectory 添加外部路徑

命令語法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

命令簡述:用於添加一個需要進行構建的子目錄

實際構建時會加載添加的目錄下的CMakeLists.txt進行構建

命令語法:target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)

命令簡述:用於指定 target 需要鏈接 item1 item2 …。這裏 target 必須已經被創建,鏈接的 item 可以是已經存在的 target(依賴關係會自動添加)

子級目錄sayhello下的CMakeLists.txt

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./sayhello/CMakeLists.txt
aux_source_directory(. LIB_SRCS)     # 添加當前目錄下所有的源文件
add_library (sayhello SHARED ${LIB_SRCS})   # 當前目錄下的文件生成一個鏈接庫

add_library 用指定文件編譯庫文件

命令語法:add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)

命令簡述:用於指定從一組源文件 source1 source2 … sourceN 編譯出一個庫文件且命名爲 name

參數詳解見add_library參數詳解

2.3 使用靜態鏈接庫

使用靜態鏈接方法與使用動態鏈接一致,只需將生成庫指定爲STATIC即可,即

dawn@DAWN-AMD:~/workstation/cmaketest$ cat ./sayhello/CMakeLists.txt
aux_source_directory(. LIB_SRCS)     # 添加當前目錄下所有的源文件
add_library (sayhello STATIC ${LIB_SRCS})   # 當前目錄下的文件生成一個鏈接庫

 


引用:

https://blog.csdn.net/weixin_39956356/article/details/100504979

https://www.cnblogs.com/wuchaodzxx/p/8916009.html

https://blog.csdn.net/bigdog_1027/article/details/79113342

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章