C++ 教程 - 05 构建编译

news2024/11/27 8:20:49

文章目录

  • 构建工具
  • cmake安装与使用
  • CMakeLists.txt编写
  • 使用案例

构建工具

cmake, Cross Platform Make, (对C++)跨平台编译工具,将CMakeLists.txt 文件编译为对应的文件,如linux下的 Makefile,然后使用make命令对Makefile编译,得到二进制可执行文件。
 
下载cmake工具
下载地址:https://github.com/Kitware/CMake/releases

 

cmake安装与使用

这里以CentOS 8.5 为例,进行说明,下载cmake-3.29.6-linux-x86_64.sh;

  • 将下载的cmake-xx.sh拷贝到linux系统下
# scp 基于ssh
scp -r .\cmake-3.29.6-linux-x86_64.sh laufing@192.168.0.109:/home/laufing

在这里插入图片描述
出现以上问题,将known_hosts删除即可;也可以重新配置ssh的免密登录。

  • linux下安装cmake
# 执行sh脚本,进行安装
sh cmake-3.29.6-linux-x86_64.sh
# 一路输入 y

# 创建软连接
ln -s /home/laufing/cmake-3.29.6-linux-x86_64/bin/cmake /bin/cmake # 权限不够加sudo

# 测试
[laufing@centos ~]$ cmake
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.

在这里插入图片描述
 

CMakeLists.txt编写

  • 官方文档参考
  • 命令大小写均可;
  • C++项目构建目录结构
    • projectDir
      • build
        • CMakeLists.txt
      • include
      • src
      • lib
  • 如下 CMakeLists.txt常用命令:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)

# 指定项目名称
project(appName)

# 头文件目录
include_directories(/home/user/include)  # 也可以指定多个,空格分割
include_directories(${PROJECT_BINARY_DIR}/../include) # 多次指定

# 将src下的源码 放入指定变量中
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRCS) # 可多次指定
# 设置环境变量
set(SRC_PATH ${SRCS}) # 将SRCS变量中的源码 放入SRC_PATH环境变量中
# unset(VAR SRC_PATH)  取消变量

# 添加可执行文件
add_executable(app ${SRCS}) # 将SRCS变量中的源码 编译为app可执行文件 ,也可单独指定xx.cpp
# add_executable(app ${SRCS} ${HDRS} ${PROJECT_UIS_H})

# 链接库
target_link_libraries(app dl protobuf) # app可执行文件 需要连接的库文件(空格分割或换行)
# 默认到 /lib; /usr/lib; /usr/local/lib下搜索库名 (libdl.so、libprotobuf.so)

# 将 指定源码 编译为 动态库/静态库
add_library(libName SHARED ${SRCS}) # SHARED 动态库   STATIC 静态库
# windows 
# lauf.lib 静态库  链接时需要放入项目代码中(项目较大)
# lauf.dll 动态库  链接时,在项目代码仅加入库的指向,执行时再按照指向搜索动态库
# linux下
# liblauf.a  静态库  lauf为库名称
# liblauf.so 动态库 
# 连接so动态库时,若库文件为liblauf.so.0.0.0 , 则需要创建软连接liblauf.so , 然后链入软连接的库名
# ln -s /xx/liblauf.so.0.0.0 liblauf.so

# 查找路径
find_path(MY_PATH /home/user/dir1 /home/user/dir2) # 将查找路径存入MY_PATH变量中
# 查找库
find_library(MY_LIB pthread /lib /usr/lib /usr/local/lib) # 在指定路径下查找pthread库,存入MY_LIB变量中
# 查找包
find_package(MY_PKG p1 /xx/xx)
# 文件查找
file(GLOB_RECURSE SRCS ${PROJECT_BINARY_DIR}/../src/*.cpp)  # 查找*.cpp 存入SRCS变量中

# 添加编译选项
add_compile_options(-std=c++11 -Wall)
#输出信息
message("xxx") 

# 关闭控制台
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")

更多参考

  • cmake的系统变量

    • ${PROJECT_BINARY_DIR} 是执行cmake的目录,即build目录;同PROJECT_SOURCE_DIR
    • ${PROJECT_NAME} 项目名称,即project() 指定的
    • ${LIBRARY_OUTPUT_PATH} 库文件的输出目录
    • ${EXECUTABLE_OUTPUT_PATH} 可执行文件的输出目录
  • cmake官网教程

 

使用案例

对如下项目,使用cmake编译。
在这里插入图片描述

  • 创建多个目录
arr=('build' 'include' 'src' 'lib')
for i in ${arr[*]}
do
    mkdir $i
done
  • 编写cpp代码
// tool.h
#ifndef TOOL_H
#define TOOL_H
#endif

using namespace std;
// declare 
const string func(const string& name);  // 字符串的引用  const传参表示函数内部无法通过引用修改变量的值



// tool.cpp
#include <iostream>
#include <string>
using namespace std;


const string func(const string& name){ // 

    cout << "func run:" << name << endl;
    return name;
}


// main.cpp
#include <iostream>
#include "tool.h"
using namespace std;


int main(){

    const string name = "jack";
    func(name);
    return 0;
}

  • 编写CMakeLists.txt

cmake_minimum_required(VERSION 3.14)

project(app)

include_directories(${PROJECT_BINARY_DIR}/../include)

aux_source_directory(${PROJECT_BINARY_DIR}/../src SRCS)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
add_executable(app ${SRCS})

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
add_library(appA SHARED ${SRCS})

message(${PROJECT_SOURCE_DIR})
message(${PROJECT_NAME})

  • 开始编译
# 进入build目录
cd build
cmake .
make

日志如下:

[laufing@centos build]$ cmake .
-- The C compiler identification is GNU 8.5.0
-- The CXX compiler identification is GNU 8.5.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
/home/laufing/projectDir/build
app
-- Configuring done (0.3s)
-- Generating done (0.0s)
-- Build files have been written to: /home/laufing/projectDir/build
[laufing@centos build]$ make
[ 16%] Building CXX object CMakeFiles/app.dir/home/laufing/projectDir/src/main.cpp.o
[ 33%] Building CXX object CMakeFiles/app.dir/home/laufing/projectDir/src/tool.cpp.o
[ 50%] Linking CXX executable app
[ 50%] Built target app
[ 66%] Building CXX object CMakeFiles/appA.dir/home/laufing/projectDir/src/main.cpp.o
[ 83%] Building CXX object CMakeFiles/appA.dir/home/laufing/projectDir/src/tool.cpp.o
[100%] Linking CXX shared library /home/laufing/projectDir/lib/libappA.so
[100%] Built target appA

  • 测试可执行文件
# 执行
[laufing@centos build]$ ./app
func run:jack

同时在build/lib目录下生成动态库

[laufing@centos projectDir]$ cd lib
[laufing@centos lib]$ ls
libappA.so

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法(C语言)】离散事件模拟- 单链表和队列的混合实际应用

目录 1. 前言2. 流程图3. 数据结构3.1 单链表3.2 链式队列 4. 核心函数4.1 银行业务模拟 void BankSimulation()4.2 初始化 void OpenForDay()4.3 客户到达 void CustomerArrived(Event en)4.4 客户离开 void CustomerArrived(Event en) 5. 非核心函数5.1 新建客户 NewCustomer…

手机天线都去哪里了?

在手机的演变历程中&#xff0c;天线的设计和位置一直是工程师们不断探索和创新的领域。你是否好奇&#xff0c;现在的手机为什么看不到那些曾经显眼的天线了呢&#xff1f; 让我们一起揭开这个谜题。 首先&#xff0c;让我们从基础开始&#xff1a;手机是如何发出电磁波的&…

云手机在跨平台兼容性方面优势明显?有何应用场景

跨平台设备间无缝切换和数据同步的需求现在是很多人或者企业都需要的&#xff0c;云手机在这些方面似乎有很大优势&#xff1f;下面我们来具体探讨在兼容方面&#xff0c;云手机有何出彩之处&#xff1f;又支持哪些应用场景呢 先来说说云手机跨平台兼容性优势所在&#xff0c;要…

web端使用高德地图

web端使用高德地图 一、申请高德key和秘钥二、在项目中引入所需功能js、css文件三、实现地图选点、回显选点四、自定义地图私密限制 一、申请高德key和秘钥 申请高德key 申请成功后可以得到key 二、在项目中引入所需功能js、css文件 <script src"https://webapi.am…

大模型网信办备案全网最详细说明(附附件)

本文共分为以下几个章节 一、大模型算法备案的强制性 二、生成式人工智能(大语言模型)安全评估要点 三、大模型备案必备材料重点说明 四、大模型备案填报流程 五、大模型备案时间成本对比 六、备案建议 附录、过程性材料 一、大模型算法备案的强制性 1、强制要求备案 …

JMeter详解

一、线程组 作用:线程组就是控制Imeter用于执行测试的一组用户 位置:右键点击测试计划’-->添加 -->线程(用户)--> 线程组 特点: 模拟多人操作线程组可以添加多个&#xff0c;多个线程组可以并行或串行取样器(请求)和逻辑控制器必须依赖线程组才能使用线程组下可以…

ECM和MEMS技术在心肺声学监测中的应用

心肺疾病是全球范围内导致死亡的主要原因。因此&#xff0c;对这些疾病迹象的准确和快速评估对于为患者提供适当的医疗保健至关重要。心血管疾病最重要的迹象之一是心脏周期的异常。大多数呼吸系统疾病则表现为呼吸周期的异常。有多种方法可以监测心脏和肺部的周期。听诊是监测…

【面试干货】Java中的访问修饰符与访问级别

【面试干货】Java中的访问修饰符与访问级别 1、public2、protected3、默认&#xff08;没有访问修饰符&#xff09;4、private &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;访问修饰符用于控制类、变量、方法和构造器…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解决办法&#xff1a;视图-裁剪起点&#xff0…

“Docker入门指南:概念与安装详解“

目录 # 概念 1. Docker常见问题 2. docker概念和安装 2.1 Docker的组成 2.2 Docker 组件及关系表 2.3 docker核心思想 2.4 docker镜像与容器两个核心概念 2.5 容器概念图 2.6 docker核心技术 2.6.1 镜像 (Image) 概述 关系 示例 2.6.2 容器 (Container) 概述 关…

贪吃蛇——c语言版

文章目录 演示效果实现的基本功能技术要点源代码实现功能GameStart打印欢迎界面和功能介绍绘制地图创建蛇创建食物 GameRun打印提示信息蛇每走一步 GameEnd蛇死亡后继续游戏 演示效果 贪吃蛇1.0演示视频 将终端应用程序改为控制台主机 实现的基本功能 贪吃蛇地图绘制蛇吃食物的…

[Mysql] 数据库基本概念

前言---数据库系统发展史 当今主流数据库介绍 一、操作系统 Linux操作系统 &#xff1a;RedHat CentOS Debian Ubuntu OpenSUSE 信创标准 会让系统逐渐国产化 国产系统&#xff1a;华为 欧拉 阿里 龙蜥 腾讯 tencentOS 银河麒麟 中标麒麟…

分享:MoneyPrinterTurbo只需一个视频主题或关键词全自动生成一个高清的短视频

MoneyPrinterTurbo是基于原有的MoneyPrinter项目进行优化和重构后推出的新版本。它利用先进的AI技术&#xff0c;通过用户提供的视频主题或关键词&#xff0c;全自动生成视频文案、素材、字幕以及背景音乐&#xff0c;并最终合成高清的短视频。 功能特性 AI智能文案生成&…

redis高可用-主从同步

目录 一&#xff1a;背景 二&#xff1a;实现方式 三&#xff1a;实际使用 一&#xff1a;背景 上一节我们介绍了centos下redis下的安装配置&#xff0c;是在单台服务器部署一个redis服务&#xff0c;这种模式是单机模式下使用的&#xff0c;如果出现服务故障&#xff0c;re…

Spring AI 调用 openAI 进行语音识别

Spring AI支持语音识别功能&#xff0c;目前仅支持OpenAI的Transcription模型。 项目搭建&#xff1a; 参考 Spring AI 介绍以及与 Spring Boot 项目整合 源码示例&#xff1a; RestController RequestMapping("/openai") public class OpenAiIAudioTranscriptionC…

幂集000

题目链接 幂集 题目描述 注意点 集合中不包含重复的元素 解答思路 可以使用深度优先遍历的思想按顺序将相应的元素添加到子集中&#xff0c;并将每个子集添加到结果集 代码 class Solution {public List<List<Integer>> subsets(int[] nums) {List<List&…

VirtualBox虚拟机下安装Ubuntu24.04操作系统

目录 0 背景1 虚拟机的安装1.1 下载安装包1.2 走安装向导 2 操作系统的安装2.1 下载光盘镜像文件2.2 安装操作系统到虚拟机上 3 基本配置3.1 网络连接方式3.2 共享文件夹3.3 设置显存大小 0 背景 首先说说Ubuntu系统&#xff0c;或者更普遍一点&#xff0c;Linux系统究竟有什么…

Java项目学习(员工管理)

新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API&#xff0c;其中每个方法的返回值会直接序列化为 JSON 或…

Mirillis Action v4 解锁版安装教程(专业高清屏幕录像软件)

前言 Mirillis Action!&#xff08;暗神屏幕录制软件&#xff09;专业高清屏幕录像软件&#xff0c;被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件&#xff0c;拥有三大硬件加速技术&#xff0c;支持以超高清视频画质录制桌面和实况直播&#xff0c;超清视频画…

90 Realistic Arctic Environment Textures snow(90+种逼真的北极环境纹理--雪、冰及更多)

一组90多个逼真的雪、冰、雪地岩石和其他被雪覆盖的地面纹理,供在雪地环境中使用。每个纹理都是可贴的/无缝的,并且完全兼容各种不同的场景--标准的Unity地形、Unity标准着色器、URP、HDRP等等都兼容。 所有的纹理都是4096x4096,并包括一个HDRP掩码,以完全支持HDRP。 特点。…