cmake相關鏈接
目錄
aux_source_directory 將制定路徑下所有源文件保存到變量
target_link_libraries 將目標文件與庫文件進行鏈接
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_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