之前博客写的编译CMake的代码都太过复杂,其实根本需要这么多句话。现在来记录一下最最简单的写法。
首先上一下项目的结构。
项目很简单,旧一个include文件夹存放.h头文件,一个src存放cpp文件。需要attention的是,src下面必须有个main.cpp,并且里面必须有一个main函数作为主入口。否则CMake找不到他就会报错了。我们看看源码。
stock.h
#include <string>
using namespace std;
class Stock
{
private:
string company;
long shares;
double share_val;
double total_val;
void set_tot(){
total_val = shares * share_val;
}
public:
Stock();
Stock(const string &co, long n=0, double pr=0.0);
// ~Stock();
// void buy(long num, double price);
// void sell(long num, double price);
// void update(double price);
void show();
};
stock.cpp
#include <iostream>
#include "stock10.h"
#include <string>
using namespace std;
Stock::Stock(){
cout << "Default constructor call\n";
company = "no name";
shares = 0;
share_val = 0;
total_val = 0.0;
}
Stock::Stock(const string &co, long n, double pr){
cout << "Constructor using " << co << "called\n";
company = co;
if (n<0){
shares = 0;
} else {
shares = n;
}
share_val = pr;
set_tot();
}
void Stock::show(){
cout << "company: " << company << endl;
}
main.cpp
#include <iostream>
#include "stock10.h"
int main(int, char**){
std::cout << "Hello, from cls!\n";
Stock apple("apple", 12, 20.0);
apple.show();
}
可以看到所有的导包直接引入源文件就可以,也不需要引入路径,因为路径将在接下来的CMakeLists.txt引入。
CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(cls VERSION 0.1.0 LANGUAGES C CXX)
include(CTest)
enable_testing()
include_directories(${PROJECT_SOURCE_DIR}/include)
# file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.cpp)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_executable(cls ${SRC_LIST})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
上面的看着很复杂,其实就两句话比较重要。其他都是vscode直接生成的。
include_directories(${PROJECT_SOURCE_DIR}/include)
这句话直接引入所有头文件。
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
这句话找到所有的cpp文件并放入SRC_LIST变量中,上面这句话可以用下面这句话代替,作用是完全一样。
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.cpp)
如果想知道到底什么东西存入了SRC_LIST里面了,可以用message函数打印一下。
message(${SRC_LIST})
最后,把我们自定义的这个SRC_LIST变量加入到executable。就可以编译了。
add_executable(cls ${SRC_LIST})