cmake-将源文件编译为可执行文件

发布时间:2024年01月13日

准备工作

首先我们准备三个文件
add.h

int add(int a,int b);

add.cpp

int add(int a,int b)
{
    return a+b;    
}

main.cpp

#include "add.h"
#include <iostream>
int main()
{
    int a = 2, b = 3;
    std::cout<<add(a,b)<<std::endl;
    return 0;    
}

创建cmake文件

?我们创建一个CMakeLists.txt的文件,文件的名称区分大小写,必须命名为CMakeLists.txt,CMake才能够解析。
首先看一下我们的目录结构,在外层有一个CMakeLists.txt文件。
在这里插入图片描述
首先我们来编写最外层的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.20)
project(cmake_study)
add_subdirectory(lesson1_1)

第一行,设置CMake所需的最低版本。如果使用的CMake版本低于该版本,则会发出致命错误。
第二行,声明了项目的名称(cmake_study)。
第三行,添加包含的子文件夹。
这时候cmake会认为进入了子文件夹中,所以这时候我们来看一下子文件夹中的CMakeLists.txt文件的编写。

add_executable(lesson1_1 main.cpp add.cpp)

?指示CMake创建一个新目标:可执行文件lesson1_1。这个可执行文件是通过编译和链接源文件main.cpp和add.cpp生成的。CMake将为编译器使用默认设置,并自动选择生成工具。
?这个过程类似于厨师炒菜,需要原材料指定给他,他就可以根据这些原材料做出你想要的菜。

编译源代码

现在,可以通过创建build目录,在build目录下来配置项目:

$ mkdir -p build
$ cd build
$ cmake ..
[main] 正在配置项目: cmake_study 
[proc] 执行命令: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -SC:/cmake_study -Bc:/cmake_study/build -G "Visual Studio 17 2022" -T host=x64 -A x64
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring done (0.0s)
[cmake] -- Generating done (0.0s)
[cmake] -- Build files have been written to: C:/cmake_study/build
[visual-studio] 为 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat 修补从 C:\Program Files (x86)\Windows Kits\10\bin\x64 到 C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64 的 Windows SDK 路径

如果一切顺利,项目的配置已经在build目录中生成。我们现在可以编译可执行文件:
使用命令cmake --build .就可以生成.exe文件
在这里插入图片描述

需要的文件不在同一个文件夹的情况

我们经常会遇到需要编译的文件在不同文件夹的情况
在这里插入图片描述
这时候我们需要修改我们的cmake文件

include_directories(../lesson1_1)
add_executable(lesson1_2 main.cpp ../lesson1_1/add.cpp)

include_directories命令用于指定包含的头文件路径。
在这里插入图片描述
总而言之,编写cmake最核心的内容就是让厨师可以找到所有的原材料来进行炒菜。

文章来源:https://blog.csdn.net/qq_45526401/article/details/135572534
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。