如何使用 CMakeLists.txt 在 CMake 项目中生成一个可执行程序

文章目录

main.cpp

cpp 复制代码
#include <iostream>
/**
 * 代码作者:小秋SLAM入门实战
 * 开发环境:Ubuntu 16.04
 * 运行依赖:C++ 11
 */
int main(int argc, char** argv){
    std::cout<<"小秋SLAM入门实战"<<std::endl;
    return 0;
}

CMakeLists.txt

cpp 复制代码
cmake_minimum_required(VERSION 2.8.4)

# 隐式定义变量<projectname>_BINARY_DIR,<projectname>_SOURCE_DIR,PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR
# HELLO_SOURCE_DIR 工程路径~/cmake_tutorial/tutorial_1
# HELLO_BINARY_DIR 编译路径~/cmake_tutorial/tutorial_1/build
# 可以使用MESSAGE打印这两个变量的值
project(tutorial_1)

# 生成可执行文件
add_executable(tutorial_1 main.cpp)

# MESSAGE 向终端输出信息
message(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
message(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})

message( "This is BINARY dir " ${PROJECT_BINARY_DIR})
message( "This is SOURCE dir " ${PROJECT_SOURCE_DIR})


# 跨平台 Linux/Unix平台生成 makefile
# 管理大型项目
# Cmake 的工具链:cmake+make
# CMakeLists.txt每个目录一个
# CMakeLists.txt文件名是大小写相关
# cmake语法
# 变量大小写相关使用${}方式取值,区别于IF需要变量名而不是变量值
# 指令大小写无关(参数 1 参数 2...)参数大小写相关使用括弧括起之间使用空格或分号分开

使用 cmake ..make -j 来编译项目是 CMake 常见的构建步骤。这些命令通常在项目的一个专门的构建目录中执行,以便将构建文件与源代码分离。这种方法被称为"out-of-source"构建,有助于保持源代码目录的整洁。让我们通过一个步骤来了解如何执行这一过程。

按照以下步骤进行构建:

创建一个构建目录

  1. 创建一个构建目录:在项目的根目录中创建一个新目录,用于存放构建产生的所有文件。

    bash 复制代码
    mkdir build
    cd build

运行 CMake

  1. 运行 CMake :使用 cmake .. 从构建目录中生成 Makefile。这里的 .. 指的是包含 CMakeLists.txt 的父目录。

    bash 复制代码
    cmake ..

编译项目

  1. 编译项目 :使用 make -j 命令来编译项目。-j 参数后可以指定数字,表示同时运行的编译作业数。如果不指定数字,make 将尝试同时运行尽可能多的作业,以加快编译速度。

    bash 复制代码
    make -j

假设你的项目结构如下:

复制代码
/MyCMakeProject
|-- CMakeLists.txt
|-- main.cpp

MyCMakeProject 目录中,执行以下命令:

bash 复制代码
mkdir build
cd build
cmake ..
make -j

这将在 build 目录中编译项目。编译完成后,你可以在 build 目录中找到生成的可执行文件。

总结

通过在一个独立的构建目录中使用 cmake ..make -j 命令,可以有效地构建 CMake 项目,同时保持源代码目录的清洁。这种方法提供了更灵活的构建选项,并允许在同一源代码基础上进行多种不同配置的构建。

相关推荐
蒸蒸yyyyzwd7 小时前
cpp 选手秋招学习笔记 day33
c++·笔记·求职招聘
hansang_IR14 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
ChampaignWolf14 小时前
在 SAP S/4HANA 内部基于 ICF Handler 从零实现 ABAP MCP Server:架构、代码与踩坑实录
c++·架构·sap·abap·mcp
尘客-追梦16 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
有点。16 小时前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
啦啦啦啦啦zzzz16 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
nLif17 小时前
基于GTK的简易MFC对话框兼容层 -- MfcToGTK
linux·c++·mfc·gtk
小小、码农19 小时前
C++11右值引用与移动语义 —— 从拷贝资源到转移资源
开发语言·网络·c++·网络协议
charlie11451419120 小时前
C++ 的新标准容器:flat_map、inplace_vector 与 mdspan
开发语言·c++·开源项目
唠玖馆21 小时前
c++AVL树
开发语言·c++