构建工具CMake新手指南

时间:2021-09-16
本文章向大家介绍构建工具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)

原文地址:https://www.cnblogs.com/FSCoder/p/15302049.html