1. 前言
[廢話]使用Linux進行編程開發,怎麼能不會編寫CMakelist呢,要不然自己創造的code都不能編譯、運行、調試。
對於我們這種非計算機科班出身的人來講,程序編譯鏈接等底層原理都不是很清楚,再加上CmakeList一些語法、關鍵字不好記也不好理解,但是不能因爲難而望而卻步。
對於像我這樣的實用爲主的攻城獅來講,功能簡單夠用就行,學習一些簡單的語法,夠平時調試算法就行,這樣難度也就小一些了。
如果想了解一點g++編譯,可以戳這裏: g++ 手動編譯程序
關於cmake和g++的安裝,請另行百度。
2.舉個例子
2.1 需要被編譯的代碼
代碼的組織形式如下,main.cpp調用了add、multi兩個目錄下的程序。
各個文件的代碼如下
main.cpp
#include "add.hpp"
#include "iostream"
#include "multi.hpp"
using namespace std;
int main(int argc, char** argv) {
int a, b;
a = 10;
b = 13;
std::cout << "a + b = " << add(a, b) << endl;
std::cout << "a * b = " << multi(a, b) << endl;
return 0;
}
add.cpp
#include "add.hpp"
int add(int a, int b) {
int ret;
ret = a + b;
return (a + b);
}
add.hpp
int add(int a, int b);
multi.cpp
#include "multi.hpp"
int multi(int a, int b) {
int ret;
ret = a * b;
return ret;
}
multi.hpp
int multi(int a, int b);
2.2 開始編寫CMakelists.txt
在編寫CMakelists.txt,首先先想一下,編譯程序需要告訴編譯器哪些信息,例如:
- hpp文件信息
- cpp文件信息
- 編譯後可執行文件的名稱
那後面就對照上面的問題進行解答。
2.2.1 hpp文件信息
使用include_directories,可以獲得頭文件所在的路徑
# hpp文件的信息
include_directories (${PROJECT_SOURCE_DIR}/add)
include_directories (${PROJECT_SOURCE_DIR}/multi)
在cmake中,“PROJECT_SOURCE_DIR”爲CMakeLists.cpp所在的路徑。
2.2.2 cpp文件信息
使用aux_source_directory,可以獲得源文件所在的路徑。
與頭文件hpp處理不一樣,源文件的信息需要被存儲在DIR_SRCS變量中,供後面使用,這個變量的名稱可以自定義。
# 源文件信息
# add目錄下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/add DIR_SRCS)
# multi目錄下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/multi DIR_SRCS)
# 根目錄下的cpp,也就是main.cpp
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_SRCS)
2.2.3 可執行文件的名稱
#生成可執行程序 語法:add_executable(可執行程序名 要編譯的cpp)
add_executable(Tutorial main.cpp ${DIR_SRCS})
上面的DIR_SRCS包含了兩個文件目錄下的cpp和main.cpp,Tutorial是生成可執行文件的名稱。
到此爲止一個最精簡的CMakeLists.txt編寫完成了。
2.3 編譯CMakeLists.txt
CMakeLists.txt不能直接使用,需要使用cmake編譯後生成Makefile才能make使用。有兩種方法可以編譯,推薦使用第2種:
1)直接在CMakeLists.txt的當前目錄執行cmake;
2)新建一個文件夾build,cd bulid 後執行 cmake …
使用第2種方法的好處是cmake生成的臨時文件會存放在build目錄下,避免了與開發文件混雜在一起。
mkdir build
cd build
cmake ..
make
2.4 其它
CMakeLists.txt中一般還會增加以下信息:
# cmake 的最小版本要求
cmake_minimum_required(VERSION 3.12)
# 這個CMakeLists管理的工程名稱
project(cmakeTest)
所以完整的CMakeLists.txt如下。
# cmake 的最小版本要求
cmake_minimum_required(VERSION 3.12)
# 這個CMakeLists管理的工程名稱
project(cmakeTest)
# hpp文件的信息
include_directories (${PROJECT_SOURCE_DIR}/add)
include_directories (${PROJECT_SOURCE_DIR}/multi)
# 源文件信息
# add目錄下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/add DIR_SRCS)
# multi目錄下的cpp
aux_source_directory(${PROJECT_SOURCE_DIR}/multi DIR_SRCS)
# 根目錄下的cpp,也就是main.cpp
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_SRCS)
#生成可執行程序 語法:add_executable(可執行程序名 要編譯的cpp)
add_executable(Tutorial ${DIR_SRCS})