1. 程式人生 > 其它 >構建工具CMake新手指南

構建工具CMake新手指南

教程一:編譯單獨的cpp檔案

專案結構:

T1/
| -- CMakeLists.txt
| -- build /
| -- main.cpp

main.cpp

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct SA {
    char c;
    int i;
    string s;
};

class TreeNode {
public:
    TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
    const int Val() const { return val; }

private:
    int val;
    TreeNode *left;
    TreeNode *right;
};

template <typename T>
void PrintVec(const T &vec) {
    if (vec.size() == 0) {
        return;
    }
    for (int i = 0; i < vec.size() - 1; i++) {
        cout << vec[i] << " ";
    }
    cout << vec[vec.size() - 1] << endl;
}

int main() {
    vector<int> vi{1, 2, 3};
    vector<string> vs{"A", "B", "C"};
    vector<SA> vsa = {SA{'a', 1, "A"}, SA{'b', 2, "B"}};
    vector<TreeNode *> vtn = {new TreeNode(10), new TreeNode(20)};
    PrintVec(vi);
    PrintVec(vs);
    cout << "vsa:[" << vsa[0].c << "," << vsa[0].i << "," << vsa[0].s << "]" << endl;
    cout << "vtn:" << vtn[1]->Val() << endl;
    return 0;
}

CMakeLists.txt

project(T1)
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 11)
add_executable(main main.cpp)

教程二:編譯多個檔案

專案結構:

T1/
| -- CMakeLists.txt
| -- build /
| -- main.cpp
| -- src /
| ---- func.h
| ---- func.cpp

func.h

#ifndef __FUNC_H__
#define __FUNC_H__

#include <vector>
#include <string>
#include <iostream>

using namespace std;

struct SA {
    char c;
    int i;
    string s;
};

class TreeNode {
public:
    TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
    const int Val() const { return val; }

private:
    int val;
    TreeNode *left;
    TreeNode *right;
};

template <typename T>
void PrintVec(const T &vec);

#endif

func.cpp

#include "func.h"

template <typename T>
void PrintVec(const T &vec) {
    if (vec.size() == 0) {
        return;
    }
    for (int i = 0; i < vec.size() - 1; i++) {
        cout << vec[i] << " ";
    }
    cout << vec[vec.size() - 1] << endl;
}

template void PrintVec(const vector<int>&);
template void PrintVec(const vector<string>&);

main.cpp

#include <iostream>
#include <vector>
#include <string>

#include "src/func.h"

using namespace std;


int main() {
    vector<int> vi{1, 2, 3};
    vector<string> vs{"A", "B", "C"};
    vector<SA> vsa = {SA{'a', 1, "A"}, SA{'b', 2, "B"}};
    vector<TreeNode*> vtn = {new TreeNode(10), new TreeNode(20)};
    PrintVec(vi);
    PrintVec(vs);
    cout << "vsa:[" << vsa[0].c << "," << vsa[0].i << "," << vsa[0].s << "]" << endl;
    cout << "vtn:" << vtn[1]->Val() << endl;
    return 0;
}

CMakeLists.txt

project(T1)
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 11)
add_executable(main main.cpp src/func.cpp)

可以看出改動只是在add_executable新增了src/func.cpp檔案。但是當檔案特別多的時候,這種寫法豈不是累死人,還容易出錯。其實使用aux_source_directory命令更方便些。

project(T1)
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 11)
aux_source_directory(src SRCS)
add_executable(main main.cpp ${SRCS})

還有我們也可以將src目錄下的檔案編譯成一個庫來使用:

project(T1)
cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 11)
aux_source_directory(src SRCS)

add_library(MY_FUNC ${SRCS})

add_executable(main main.cpp)
target_link_libraries(main MY_FUNC)