C++ 之CMake代码编译

1、编译过程

  • 预处理-Pre-Processing //.i文件
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //.i文件
  • 编译-Compiling // .s文件
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名是 .s
g++ -S test.i -o test.s
  • 汇编-Assembling // .o文件
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o
  • 链接-Linking // bin文件
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test

但是这样编译太不方便了,接下来学习用cmake构建工程。

2、最小CMake工程

# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 3.0)

# Set the project name
project (HELLO)

# Add an executable
add_executable(hello_cmake main.cpp)

3、常用CMake命令理解

3.1 设置工程相关

  • cmake_minimum_required 指定CMake的最小版本要求
  • project 定义工程名称,并可指定工程支持的语言
  • set 显式的定义变量
  • add_compile_options 添加编译参数

3.2 设置项目内部include和lib

  • include_directories 向工程添加多个特定的头文件搜索路径 --->相当于指定g++编译器的-I参数
  • link_directories 向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数

3.3 设置(三方)库相关

  • target_include_directories 为 target 添加需要链接的共享库所在的路径-->相当于制定(三方)库路径
  • target_link_libraries 为 target 添加需要链接的共享库 -->相同于指定g++编译器-l参数

3.4 设置参与编译的cpp是生成库还是可执行文件

  • add_library 生成库文件
  • add_executable 生成可执行文件

3.5 设置文件夹

  • add_subdirectory 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
  • aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表

4、实战升级

4.1 简单设置项目头文件

 

4.2 多文件夹应用

文件格式

顶层cmakelist

cmake_minimum_required(VERSION 3.10.3)

project(planning
    VERSION 0.0.1
    DESCRIPTION "cmake multidir  demo"
    HOMEPAGE_URL ""
    LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 14)

#设置变量
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(Process_Dir ${CMAKE_SOURCE_DIR}/src/process)
set(addition_Dir ${CMAKE_SOURCE_DIR}/src/addition)

# 添加子目录-最顶层只添加src
add_subdirectory(src)

src文件所在文件夹下的cmake

project(cmake_demo)

#添加子文件夹
add_subdirectory(addition)
add_subdirectory(process)

#设置可执行文件
add_executable(${PROJECT_NAME} cmake_demo_main.cpp)

##=====================设置项目中 inclue lib =====================
#设置需要链接的模块的include路径
target_include_directories(${PROJECT_NAME}
PUBLIC
${Process_Dir}
)
#需要链接的库文件,输入是库名称
target_link_libraries(${PROJECT_NAME}
PUBLIC
process
)

##=====================设置外部中 inclue lib =====================

addition动态链接库cmake

project(addition)

add_library(${PROJECT_NAME}
SHARED
addition.cpp
)

process动态链接库cmake,process库调用了addtion库

project(process)

add_library(${PROJECT_NAME}
SHARED
process.cpp
)

#设置需要链接的模块的include路径
target_include_directories(${PROJECT_NAME}
PUBLIC
${addition_Dir}
)
#需要链接的库文件,输入是库名称
target_link_libraries(${PROJECT_NAME}
PUBLIC
addition
)
#include "process.h"

int process::print()
{
    addition map;

    int a = 10;
    int b = 11;
    std::string c = "helloworld"; 

    return map.add(a,b,c);

}

备注:mian函数所在的文件夹要带main字眼

 

4.3 引用开源三分库(以eigen为例子)

想写详细点,见下一篇文章

5、参考文章

【C++】Cmake使用教程(看这一篇就够了) - 知乎 (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LNMP部署及应用(Linux+Nginx+MySQL+PHP)

LNMP 我们为什么采用LNMP这种架构? 采用Linux、PHP、MySQL的优点我们不必多说。 Nginx是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,已经在一些俄罗斯的大型网站上运行多年,目…

QT程序通过GPIB-USB-HS转接线控制数字万用表

1、硬件准备 1.1、数字万用表 型号 :Agilent 34401A 前面图示: 后面图示:有GPIB接口 1.2、GPIB-USB-HS转接线 2、GPIB协议基础了解 2.1、引脚 8条数据线:DIO1 ~ DIO8 5条管理线:IFC、ATN、REN、EOI、SRQ 3条交握线…

冯喜运:5.2原油三连跌引发连锁反应,黄金市场拐点已至?

【黄金消息面分析】:4月ADP就业数据的强劲表现,为美联储的货币政策提供了新的挑战。在这一背景下,黄金市场的反应尤为值得关注。本文将深入探讨美国就业数据对美联储决策的影响,以及这些决策如何影响黄金市场的未来走向。通胀与就…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea,默认的英文文本可见,输入中文字体后就看不见了,是因为这个默认的字体不支持中文,改一下字体就可以了&#xff1…

Java_从入门到JavaEE_08

一、Eclipse开发工具的介绍 Eclipse工具简绍 Eclipse 是著名的跨平台的自由集成开发环境(IDE)。最初主要用来 Java 语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具。 下载与安装 下载: Ecli…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG,NIN,GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章,但是在开发中有时候也会在UI的界面中播放视频,这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image,UI->…

java-spring-mvc(服务端接收客户端传参)

目录 🎯 服务端接收参数 ✨HttpServletRequest接收 ✨ 声明参数接收 ✨声明pojo类来接收 🔪小试牛刀 🎯 服务端接收参数 ✨HttpServletRequest接收 HttpServletRequest是Java Servlet规范中定义的一个接口,它提供了与HTTP请求…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

Advanced RAG 05:探讨基于文本内在语义信息的数据分块方法

编者按&#xff1a;在 RAG (Retrieval Augmented Generation) 系统中&#xff0c;将文本数据高效地划分成相对独立且富有语义信息的数据块&#xff08;chunks&#xff09;是一项较为关键的任务。基于规则的传统数据分块方法存在一些问题&#xff0c;因此探讨基于文本内在语义信…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

PHP定时任务框架taskPHP3.0学习记录7宝塔面板手动可以执行自动无法执行问题排查及解决方案(sh脚本、删除超过特定天数的日志文件、kill -9)

PHP定时任务框架taskPHP3.0学习记录 PHP定时任务框架taskPHP3.0学习记录1&#xff08;TaskPHP、执行任务类的实操代码实例&#xff09;PHP定时任务框架taskPHP3.0学习记录2&#xff08;环境要求、配置Redis、crontab执行时间语法、命令操作以及Screen全屏窗口管理器&#xff0…

AWS最近宣布Amazon Q现已全面上市

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Gateway结合Nacos使用!!!

一、本地结合使用 1. 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> 2. bootstarp.yml配置文件 如果Nacos中配置使用yaml格式&…

Ubuntu上的screenfetch

2024年4月28日&#xff0c;周日下午 这些文本是由一个叫做 “screenfetch” 的命令生成的&#xff0c;它会显示一些系统和用户信息&#xff0c;包括操作系统、内核版本、系统运行时间、安装的软件包数量、使用的Shell、分辨率、桌面环境、窗口管理器、主题、图标主题、字体、CP…

Linux(ubuntu)—— 用户管理user 用户组group

一、用户 1.1、查看所有用户 cat /etc/passwd 1.2、新增用户 useradd 命令&#xff0c;我这里用的是2.4的命令。 然后&#xff0c;需要设置密码 passwd student 只有root用户才能用passwd命令设置其他用户的密码&#xff0c;普通用户只能够设置自己的密码 二、组 2.1查看…

分布式任务调度平台XXL-JOB

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Qu…

汇川AM400PLC和禾川X3E伺服EtherCAT通信

1、汇川H5UPLC和X3E伺服EtherCAT总线控制 汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_伺服驱动器 ethercat csdn 汇川-CSDN博客文章浏览阅读1.7w次,点赞3次,收藏37次。首先我们看下系统硬件和软件配置:汇川H5U PLC的编程软件是:AutoShop V4.6.3.0 硬件:PLC H5U-161…

什么副业兼职适合小白?1小时收益40+,1条作品只需5分钟

今天&#xff0c;我要向大家推荐一个当前非常受欢迎的项目&#xff0c;这个项目来自一位忠实的粉丝朋友的推荐。他正是依靠这个项目实现了可观的收益。 这位兄弟通过参与“词典搬砖”项目&#xff0c;已经成功变现超过一万元&#xff0c;而且这笔收入还是在睡眠中获得的&#…

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y&#xff0c;解释变量记为x1&#xff0c;x2,… 因变量y一般…