CMake编译C++工程的最简单写法

之前博客写的编译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})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值