如何從0到1寫一個非常簡單CMakeLists

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})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章