構建工具CMake新手指南
阿新 • • 發佈:2021-09-16
教程一:編譯單獨的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)