Cmake的CMakeLists.txt写法示例

Cmake的CMakeLists.txt写法示例

目录

  1. 示例一:单文件
  2. 示例二:多个源文件
  3. 示例三:将hello.c生成一个库来调用
  4. 示例四:工程分类文件夹编译
  5. 示例五:Cmake的install使用

示例一:单文件

  1. 文件名字为main.cpp,内容如下:
#include <iostream>

int main() {
    printf("Hello World!\n");
    return 0;
}
  1. CMakeLists.txt文件内容如下,其中:
    a. cmake_minimum_required:对cmake的最低(高)版本的要求。
    b. project:cmake工程的名称,不是强制性的,最好加上。
    c. set:用来定义变量。
    d. add_executable:使用指定的源文件来生成目标可执行文件。
    e. message:输出显示信息。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)

set(CMAKE_CXX_STANDARD 14)

add_executable(${PROJECT_NAME} main.cpp)

message(${PROJECT_NAME})
  1. CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
  2. 编译时在当前目录新建一个build目录,进行build目录执行:cmake …/ ,产生的临时文件就会在build目录下,不影响源码目录代码。
  3. 最后在此目录执行make命令生成相应的可执行程序。
    a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。
    在这里插入图片描述

示例二:多个源文件

  1. hello.h头文件内容如下:
    void hello(const char* name);
  2. hello.cpp文件内容:
#include <stdio.h>
#include "hello.h"
 
void hello(const char* name) {
    printf("Hello my name is %s\n",name);
}
  1. main.c文件内容如下:
#include <iostream>
#include "hello.h"

int main() {
    printf("Hello World!\n");
    hello("hello");
    return 0;
}
  1. CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)

set(CMAKE_CXX_STANDARD 14)
set(SRC_LIST main.cpp hello.cpp hello.h)

add_executable(${PROJECT_NAME} ${SRC_LIST})

message(${PROJECT_NAME})

示例三:将hello.c生成一个库来调用

  1. 如果将hello生成成一个库来调用的话只需要在事例二的基础上修改一下CMakeLists.txt文件再进行编译。
  2. 修改的CMakeLists.txt如下:
    a. add_library:指定的源文件生成链接文件添加到工程中。
    b. target_link_libraries:将目标文件与库文件进行链接。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)

set(CMAKE_CXX_STANDARD 14)
set(LIB_SRC hello.cpp)
set(SRC_LIST main.cpp)

add_library(hello ${LIB_SRC})

add_executable(${PROJECT_NAME} ${SRC_LIST})

target_link_libraries(${PROJECT_NAME} hello)

message(${PROJECT_NAME})
  1. 与事例二相比,添加了一个新的目标hello库,并将其链接到我们的cmake-demo程序。
  2. 然后用同样的方法进行cmake和make进行编译。

示例四:工程分类文件夹编译

  1. 如果代码量比较大,会将代码分开放置,进行分类,形成分成多个文件夹。

  2. 比如main.cpp程序放在app目录下面,hello.cpp和hello.h放在libso文件夹下面。
    a. 当前文件夹有一个CMakeLists.txt文件,app和libso文件夹下面也有CMakeLists.txt文件。
    在这里插入图片描述

  3. 首先看app文件夹的CMakeLists.txt。

project(cmake-demo)

include_directories(${PROJECT_SOURCE_DIR}/../../libso)

set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)

message(${PROJECT_NAME})
  1. 然后看libso文件夹的CMakeLists.txt,其中SHARED表示是生成的动态库,如果把SHARED去掉的话就是生成静态库。
project(helloso)

set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})
  1. 最外面文件夹的CMakeLists.txt:
cmake_minimum_required(VERSION 3.21)
project(cmake)

add_subdirectory(./app)
add_subdirectory(./libso)

在这里插入图片描述

  1. 最后到build目录下执行 cmake …/ 和 make 进行编译。生成目录如下:
    a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。

示例五:Cmake的install使用

  1. cmake中install是将编译好的可执行文件或者生成的库文件放到系统对应的位置,比如说可执行文件直接要放到bin目录下面,so库文件要放到对应的lib目录下面。
  2. 修改上面例子的CMakeLists.txt文件,编辑完成后编译多了install步骤,这样可以在Linux上面使用该执行文件,执行文件会调用so库。即执行命令为:
cmake ../
make
make install
  1. app目录修改的CMakeLists.txt在最后一行加上install:
project(cmake-demo)

include_directories(${PROJECT_SOURCE_DIR}/../../libso)

set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)

message(${PROJECT_NAME})

install(TARGETS ${PROJECT_NAME} DESTINATION bin)
  1. libso目录修改的CMakeLists.txt在最后一行加上install:
project(helloso)

set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})

install(TARGETS ${PROJECT_NAME} DESTINATION ../lib)
  1. 解释:
    a. install(TARGETS ${PROJECT_NAME} DESTINATION bin):安装cmake-demo可执行文件到${CMAKE_INSTALL_PREFIX}/bin目录。
    b. 可以自行打印CMAKE_INSTALL_PREFIX路径,比如/usr/local,注意bin前面不能有/。
    c. 所以执行行文件的路径是/usr/local/bin/,so库文件的安装路径是:/usr/local/…/lib/
    d. 此时可以在Linux系统任何目录里执行./cmake-demo
    e. 如果执行make install的时候出现错误,加上sudo再次执行。
### 使用Matlab进行风电功率预测 #### 基于TCN的风电功率预测 时间卷积网络(Temporal Convolutional Network, TCN)是一种用于序列建模的有效工具,在风电功率预测中有广泛应用。以下是基于TCN的风电功率预测的一个简单实现示例[^1]: ```matlab % 加载数据集 data = load('wind_power_data.mat'); % 数据文件应包含历史风力发电功率和其他特征 X_train = data.X_train; Y_train = data.Y_train; X_test = data.X_test; % 定义TCN模型结构 model = createTCNModel(inputSize); % 训练模型 options = trainingOptions('adam', ... 'MaxEpochs', 50, ... 'MiniBatchSize', 64, ... 'InitialLearnRate', 0.001); net = trainNetwork(X_train, Y_train, layers, options); % 预测未来时刻的风电功率 YPred = predict(net, X_test); function model = createTCNModel(inputSize) layers = [ sequenceInputLayer(inputSize) tcnLayer(8, 32) % 时间卷积层 batchNormalizationLayer() reluLayer() fullyConnectedLayer(1) regressionLayer()]; model = dlnetwork(layers); end ``` 此代码片段展示了如何定义一个简单的TCN架构来处理多变量输入并执行单步预测。 #### 支持向量机结合ARIMA-SVM的混合模型 另一种常见的方法是利用支持向量机和支持向量回归(SVR),并与自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model, ARIMA)相结合,形成一种强大的组合预测技术[^2]: ```matlab % 准备数据... load windPowerData; % 构造ARIMA部分... arimaModel = arima('Constant', 0,'D',1,'Seasonality',12,... 'MALags',[1 12],'SMALags',12); fitArima = estimate(arimaModel,yTrain); % SVM部分... svmStruct = fitrsvm([yTrain'], yTrain'); residuals = residuals(fitArima); % 组合预测... combinedForecast = forecast(fitArima,numStepsAhead)+predict(svmStruct,residuals(end-numStepsAhead+1:end)); ``` 这段脚本先拟合了一个季节性的ARIMA模型,接着训练了一个SVR用来捕捉残差中的模式,最后将两者结合起来做最终预测。 #### BP神经网络应用实例 对于BP神经网络而言,则可以通过如下方式构建和训练模型以完成同样的任务[^3]: ```matlab % 初始化参数... hiddenLayerSize = 10; inputVectorLength = size(trainingInputs,2); outputVectorLength = 1; % 创建并配置NN对象... bpNet = patternnet(hiddenLayerSize); bpNet.trainFcn = 'trainscg'; % 设置训练函数为尺度共轭梯度法 bpNet.performFcn = 'mse'; % 性能指标设为均方误差 bpNet.divideParam.trainRatio = 70/100; bpNet.divideParam.valRatio = 15/100; bpNet.divideParam.testRatio = 15/100; % 开始训练过程... [trainedNet,tr] = train(bpNet,trainingInputs,trainingTargets); % 应用已训练好的网络进行新数据上的预测... predictedOutputs = trainedNet(testingInputs); ``` 上述例子中,`patternnet()`被调用来初始化一个新的前馈感知器类型的神经网络,并设置了隐藏层数目及其他必要的属性。之后进行了标准的训练流程,包括分割数据集、调整权重直到收敛为止。一旦完成了这些步骤就可以使用这个已经过良好训练过的网络来进行新的未知情况下的输出估计了。 #### 考虑二十四节气影响因素的方法 考虑到中国传统的二十四节气可能会影响气候条件从而间接作用于风电产量的变化趋势,因此可以尝试采用特定于此文化背景下的策略——即针对不同节气分别建立独立的学习机制,以此提高整体准确性[^4]。 ```matlba for i=1:length(solarTerms) termIndex = find(isSolarTerm(data.Date,i)); % 判断日期属于哪个节气 if ~isempty(termIndex) currentSet = data(termIndex,:); % 对当前节气内的子集合单独建模... [models{i}, performance(i)] = buildPredictor(currentSet); end end function result = isSolarTerm(dates,termNumber) startDates = datetime({'立春','雨水','惊蛰'}); endDates = circshift(startDates,[0,-1]); endDate{length(endDates)} = dates(end); result = false(size(dates)); for k=1:numel(dates) dateInQuestion = dates(k); withinRange = any((dateInQuestion >= startDates & dateInQuestion < endDates)==true); result(k) = and(withinRange,termNumber==find(dateInQuestion>=startDates&dateInQuestion<endDates,1)); end end ``` 这里展示了一种循环遍历所有节气的方式,每次只选取那些落在给定时间段里的观测值作为临时工作区的一部分,进而允许我们更细致地探索各个阶段特有的规律性和特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值