cmake是什么励背、為什么使用cmake
在Linux環(huán)境編寫C春霍、C++時(shí),常用make工具編譯和鏈接工程叶眉,在單一的Linux環(huán)境下址儒,make已經(jīng)可以很好的發(fā)揮作用時(shí);但在復(fù)雜的開發(fā)環(huán)境衅疙、運(yùn)行環(huán)境下莲趣,make就有點(diǎn)捉襟見肘,make對(duì)環(huán)境的依賴很強(qiáng)饱溢,在不同環(huán)境下不同的編譯器等喧伞,make工具makefile文件都需要根據(jù)實(shí)際情況進(jìn)行修改,這意味著如果一個(gè)工程需要部署在復(fù)雜的環(huán)境下绩郎,對(duì)makefile的適配也將是一項(xiàng)復(fù)雜的工程潘鲫;在此背景之下,CMake應(yīng)運(yùn)而生肋杖,CMake是一個(gè)比make更高級(jí)的編譯配置工具溉仑,它可以根據(jù)不同平臺(tái)、不同的編譯器状植,生成相應(yīng)的Makefile浊竟,達(dá)到一個(gè)編寫怨喘,多環(huán)境編譯的效果。
從單文件開始
main.cpp
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.8) # cmake最低版本要求
project(CmakeHelloWorld) # 項(xiàng)目名字
set(CMAKE_CXX_STANDARD 11) # cpp標(biāo)準(zhǔn)
set(SOURCE_FILES main.cpp) # sources文件
add_executable(main ${SOURCE_FILES}) # 可執(zhí)行文件振定,將所有sources文件編譯成可執(zhí)行文件main
執(zhí)行結(jié)果:
Hello World!
編譯多文件
創(chuàng)建include/lib/lib.h
#ifndef CMAKEHELLOWORLD_LIB_H
#define CMAKEHELLOWORLD_LIB_H
namespace cmakelib{
void say_hello();
}
#endif //CMAKEHELLOWORLD_LIB_H
創(chuàng)建src/lib/lib.cpp
#include <iostream>
#include "../../include/lib/lib.h"
namespace cmakelib{
void say_hello(){
std::cout << "In lib.cpp!" << std::endl;
std::cout << "Hello World!" << std::endl;
}
}
修改main.cpp
#include "include/lib/lib.h"
int main() {
cmakelib::say_hello();
return 0;
}
目錄結(jié)構(gòu)
- include/
-lib/lib.h
- src/
- lib/lib.cpp
- CMakeLists.txt
- main.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
##############--origin--##############
## set(SOURCE_FILES main.cpp)
######################################
set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h) # 增加了lib.cpp 和 lib.h 作為sources文件
add_executable(main ${SOURCE_FILES})
執(zhí)行結(jié)果
In lib.cpp!
Hello World!
配置頭文件路徑
lib/lib.cpp包含頭文件使用相對(duì)路徑不太優(yōu)雅必怜。修改CMakeLists.txt增加include路徑,讓其優(yōu)雅一些后频。
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
## 增加這一行
include_directories(include) # 將include路徑設(shè)為頭文件目錄
set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
add_executable(main ${SOURCE_FILES})
之后可以修改lib.cpp和main.cpp里面包含lib.h的代碼
// main.cpp
// #include "include/lib/lib.h" =>
#include "lib/lib.h"
// lib.cpp
// #include "../../include/lib/lib.h" =>
#include "lib/lib.h"
配置sources文件路徑
當(dāng)cpp文件太多時(shí)梳庆,set(SOURCE_FILES ...)
命令就會(huì)變得冗長(zhǎng),通過配置sources文件路徑解決這個(gè)問題徘郭。
cmake_minimum_required(VERSION 3.8)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
##############--origin--##############
## set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
## add_executable(main ${SOURCE_FILES})
######################################
aux_source_directory(src/lib DIR_SRCS) # aux_source_directory命令增加sources文件路徑靠益,不支持遞歸
add_executable(main main.cpp ${DIR_SRCS})
執(zhí)行結(jié)果
In lib.cpp!
Hello World!
生成鏈接庫(kù)
修改一下lib.cpp,表明實(shí)在鏈接庫(kù)里面執(zhí)行的
#include <iostream>
#include "lib/lib.h"
namespace cmakelib{
void say_hello(){
std::cout << "In libcmakelib.a!" << std::endl;
std::cout << "Hello World!" << std::endl;
}
}
將lib.cpp編譯成鏈接庫(kù)残揉。
cmake_minimum_required(VERSION 3.6)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(include)
aux_source_directory(src/lib DIR_SRCS)
##############--origin--##############
## add_executable(main main.cpp ${DIR_SRCS})
######################################
add_library(cmakelib SHARED ${DIR_SRCS}) # 動(dòng)態(tài)鏈接庫(kù) => libcmakelib.so
## add_libraay(cmakelib STATIC ${DIR_SRCS}) # 靜態(tài)鏈接庫(kù) => libcmakelib.a
使用鏈接庫(kù)
上面把lib.cpp編成庫(kù)了胧后,下面看看如何使用這個(gè)庫(kù)。
創(chuàng)建ldlib目錄抱环,把libcmakelib.a放到里面去壳快,項(xiàng)目路徑如下:
- include/
-lib/lib.h
- src/
- lib/lib.cpp
- ldlib/
- libcmakelib.a
- CMakeLists.txt
- main.cpp
修改CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
project(CmakeHelloWorld)
set(CMAKE_CXX_STANDARD 11)
include_directories(./include)
aux_source_directory(./src/lib DIR_SRCS)
##############--origin--##############
## add_library(cmakelib STATIC ${DIR_SRCS})
## add_executable(main main.cpp ${DIR_SRCS})
######################################
link_directories(./ldlib) # 指定鏈接庫(kù)路徑
add_executable(main main.cpp) # 把lib變成了庫(kù),不在需要lib.cpp作為sources文件
target_link_libraries(main libcmakelib.a) # 指定鏈接的庫(kù)名
輸出結(jié)果
In libcmakelib.a!
Hello World!