【CMake】CMake构建C++代码(一)

2023-05-16

请添加图片描述
👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术


CMake构建C++代码

在Linux开发过程中,难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码,将自己的代码变为共享库,共其他代码使用。


文章目录

  • CMake构建C++代码
  • CMake简述
  • 一、构建你的第一个CMake工程
    • 2.1 工程结构
    • 2.2 文件内容
  • 三、开始构建
  • 四、构建后build文件夹结构
  • 五、安装共享库
  • 六、总结


(关注“测试开发自动化” 弓中皓,获取更多学习内容)

CMake简述

如果有朋友在Linux端使用C/C++/Fortran/Java这几种语言开发,相信对CMake构建工具不会陌生,也是大多数程序员必须掌握的一项代码构建技能。
之所以Cmake会进入大多数程序员的视线,为大多数程序员使用,主要是因为CMake主要有如下特点:

  1. 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖的调整,对整个开发工作帮助很大。
  2. 支持 SWIG、Qt、FLTK 开发框架。
  3. 支持跨平台编译,这是CMake名字的来源。
  4. CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手。
  5. 能够转换特殊平台的 IDE 项目文档,如xcode。
  6. 与Dart、CTest 和 CPack 集成,可以组成自动化的构建系统。

需要注意的是:使用CMake,程序员必需编写好CMake脚本CMAkeLists.txt,对于一些复杂的项目,可能需要编写CMake模块,但对于构建过程而言,则是极其简单的。


一、构建你的第一个CMake工程

首先,要是知道,一个标准工程,文件夹的结构应该是这样的:

  1. doc文件夹:存放工程的文档
  2. src文件夹:存放源文件
  3. bin文件夹:存放构建后的目标文件

好了,下面我们就来搭建一个简单的工程使用CMake来构建!,我们构建的前提都是在Linux系统下进行示例的。因此,大家学习的时候最好在Linux系统下学习。

2.1 工程结构

我们在自己的Linux系统的home路径下(或你自己的系统)创建一个它文件夹,并在对应的文件夹下建立对应的文件。整个t3文件夹的结构如下所示:

 t3
├── build
├── CMakeLists.txt
└── lib
       ├── CMakeLists.txt
       ├── hello.cpp
       └── hello.h

2.2 文件内容

上面创建了空的文件,下面我们就要对文件中的内容进行补充:

  1. t3/CMakeLists.txt文件:

project(hellolib) # 工程名
add_subdirectory(lib) # 在工程目录下(build文件夹)生成一个lib文件夹,并将动态、静态文件存储在build/lib文件夹下

  1. t3/lib/CMakeLists.txt文件:

set(LIBHELLO_SRC hello.cpp)
add_library(hello SHARED ${LIBHELLO_SRC}) # 生成一个hello.so的动态库文件
add_library(hello_static STATIC ${LIBHELLO_SRC}) # 生成一个hello_static.o的静态库文件
#为使生成的动态库和静态库名称一致,需要使用 set_target_properties
set_target_properties(hello_static PROPERTIES OUTPUT_NAME “hello”) # 将hello_static重命名为hello# 可得到libhello.so 和 libhello.a
set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1) # 设置生成的.so的版本为1.2
INSTALL(TARGETS hello hello_static # 将动态库libhello.so、libsello.a安装到/usr/lib中
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
INSTALL(FILES hello.h DESTINATION include/hello) # 将头文件安装到/usr/include/hello中

  1. hello.cpp文件:
#include <iostream>
void HelloFunc()
{
    std::cout << "hello world"<< std::endl;
}
  1. hello.h文件:
#ifndef HELLO_H
#define HELLO_H
#include <iostream>
void HelloFunc();
#endif

三、开始构建

这里主要采用的是外部构建的方式。外部构建即在将构建的信息生成在build文件夹中,也是极力推荐这样构建,所以内部构建这里就不作过多的解释。
在终端中输入如下Linux指令:

cd build
cmake .. && make

四、构建后build文件夹结构

构建后,build文件夹结构如下所示:


build
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── Makefile
└── lib
       ├── CMakeFiles
       ├── cmake_install.cmake
       ├── Makefile
       ├── libhello.a        # set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello") 
       ├── libhello.so       # set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello") 
       ├── libhello.so.1     # set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1)
       └── libhello.so.1.2   # set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1)

五、安装共享库

如果你希望其他人可以直接仅通过.h文件即可调用的你的代码,那么你就需要安装共享库。作用是:将头文件和共享库安装到系统目录/usr/lib 和/usr/include/hello,可以直接通过include<hello.h>的方式使用(相当于Windows的环境变量)。在build文件夹下输入:

make install

六、总结

至此,我们就完成了我们的共享库的构建,后续会讲解如何使用共享库来运行我们的代码。

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CMake】CMake构建C++代码(一) 的相关文章

  • CLion - 命令行程序参数

    当我分配给 运行 调试配置 程序参数 之类的 aaa bbb 然后打印它时 任何人都可以告诉我 JetBrains CLion 有什么问题吗 printf s n argv 1 我刚刚得到 aaa 而它必须是 aaa bbb 因为它们用双引
  • 如何使用 --build 选项查看 cmake 发出的命令

    当我运行 cmake build target INSTALL 命令时 如何查看发出的命令 似乎没有像 versbose之类的选项 cmake 帮助说 cmake build 是底层构建工具的接口 但没有说明有关发出的命令转储的任何内容 我
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • 在生成器表达式中使用 cmake 选项

    我想在生成器表达式中使用 cmake 选项 为了打开某个编译标志 来自文档 https cmake org cmake help v3 10 manual cmake generator expressions 7 html我不清楚如何实现
  • 在cmake中设置PKG_CONFIG_PATH

    我已经在本地构建了 opencv 并将其安装到本地目录 不是系统默认目录 opencv pc存在于该本地文件夹中的 pkgconfig 文件夹下 我怎样才能找到这个opencv pc来自 cmake 因为我想从我的程序链接并包含 openc
  • Cmake:将子项目目标导出到主项目

    我目前有一个项目叫做LIBS具有这样的结构 Lib1 CMakeLists txt lib1 class cpp lib1 class h lib2 CMakeLists txt lib2 class cpp lib2 class h cm
  • 如何使我的单元测试适应 cmake 和 ctest?

    到目前为止 我已经使用了一个临时的单元测试程序 基本上是由批处理文件自动运行的全部单元测试程序 尽管其中很多都明确地检查了他们的结果 但还有更多的作弊行为 他们将结果转储到版本控制的文本文件中 测试结果中的任何更改都会被颠覆标记 我可以轻松
  • CMake 创建可执行文件时未定义的引用

    我是 CMake 新手 我正在尝试编译我的项目 该项目创建了一些静态库和一些可执行文件 下面是我拥有的文件结构的示例 PROJECT SRC 子项目 1该文件夹的 cpp 所有源文件 和CMakeLists txt 1 创建静态库 子项目
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • 使用 CMake 在 iOS 中使用另一个 STATIC 库创建一个 STATIC 库

    我有一个 libfooi a 的集合 libfoo1 a libfoo2 a libfoo3 a 使用工厂 带有静态代码 有一个公共接口来创建 C 对象 使用 CMake 我选择其中之一 并创建一个链接它并添加所有内容的 libfooWra
  • 如何将新的 Visual Studio 2017 cmake 功能与 gitlab CI 运行程序结合使用

    我以直接的方式为 Linux 设置了 gitlab ci runner cmake make make test 大致如下 variables GIT SUBMODULE STRATEGY recursive stages build te
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • 如何在cmake中将构建类型更改为Release模式?

    我正在尝试以发布模式构建一个项目 默认情况下它是在调试模式下构建的 我正在设置变量CMAKE BUILD TYPE到 释放 CMakeLists txt 但它仍在调试模式下构建项目 当我在 CMake 命令中传递 Release 作为构建类
  • 是否可以让 cmake 构建文件(CMakeLists.txt)不在 CLion 的根目录中

    是否可以让 cmake 构建文件 CMakeLists txt 不在 CLion 的根目录中 我目前正在开发的项目中 cmake 构建文件不在 CLion 项目的根目录中 在 out Debug 目录中 我希望 CLion 打开该项目的根目
  • CMake第三方库安装

    我是编程新手 对于我的研究项目 我需要安装一个第三方库以便与 CMake 一起使用 GitHub项目 https github com cpp io2d P0267 RefImpl blob master BUILDING md 我在我的电
  • 使用 CLion IDE 运行 Opengl 程序 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但提供的解决方案确实对我不起作用 我想通过 CLion IDE 运行我的 OpenGL 程序 我可以通过 Ubuntu 中的终端运行相同的程序 gcc progname c lglut
  • CMake:Fortran 模块和编译顺序

    我有一个大型 Fortran 程序 其中包含许多目录 每个目录都在伪库中单独编译 但仍然存在相互依赖的混乱 因此最终所有伪库都组合在一个可用的库中 我想使用 Fortran 模块 但它非常脆弱 因为我不能依赖自动依赖项检查 并且根据顺序编译
  • 如何在cmake中静态链接到glibc

    我正在尝试从 Fedora 构建一个可以在 RedHat 6 机器上运行的包 所以我需要构建和静态链接一些RedHat机器中不存在的库 我发现我可以你 static libgcc or static libstdc 与标准库的静态版本链接
  • 如何使用 Clang 编译器和 CMake 进行分析

    Question 1 What output我应该期待当我想使用进行分析时clang编译器 2 我该怎么办profiling for a C project它使用clang作为编译器andCMake 作为构建工具 重新分析我所使用的内容 1

随机推荐

  • 用递归的方法将整数n转换成字符串

    span class token keyword int span span class token function main span span class token punctuation span span class token
  • 关于&&和||的优先级问题

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • cpu与外设之间传送数据的时存在的问题

    一 速度不匹配 I O设备的速度比cpu慢很多 xff0c I O设备的不同速度差异也很大 二 时序不匹配 每个I O设备都有自己的定时控制电路 xff0c 无法与cpu取得统一 三 信息格式不匹配 不同的I O设备存储和处理信息的格式不同
  • 微机原理计算机基础部分简答题

    简述数据总线和地址总线各自具有的特点 xff0c 如果数据总线和地址总线采用同一组信号线有什么办法将地址总线分类出来 数据总线的特点为双向三态 xff0c 数据总线位数决定cpu一次传输二进制信息的位数 地址总线的特点为单向三态 xff0c
  • 部署IIS后dll not found

    问题 xff1a Could not load file or assembly 39 XX 39 or one of its dependencies An attempt was made to load a program with
  • 汇编指令对标志位的影响

    MOV LEA XCHG PUSH POP IN OUT 传送类指令不影响标志位 ADD ADC SUB SBB CMP 加减法指令影响全部标志位 INC DEC 增一减一指令不影响CF NEG 求补指令影响除CF外的5个标志位 xff0c
  • 微处理器部分简答题

    简述8086和8088cpu的相同点和不同点 相同点 xff1a 内部数据总线均为16位 xff0c 寄存器和指令系统完全兼容 不同点 xff1a 8086的外部数据总线为16位 xff0c 8088外部数据总线为8位 xff1b 8086
  • 大浪淘沙

    裸机指的是未装备任何软件的计算机 计算机的运行速度的单位是MI S xff0c 其含义是每秒钟执行百万条指令 影响cpu处理速度的主要因素是字长 主频 ALU 有无cache 冯诺依曼原理的基本思想是程序存储和程序控制 第一代计算机采用的电
  • 关于字符数组和字符指针

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • YOLOv5核心基础知识讲解

    我这主要是江大白老师的内容 xff01 xff01 深入浅出Yolo系列之Yolov3 amp Yolov4 amp Yolov5 amp Yolox核心基础知识完整讲解 xff08 CSDN xff09 深入浅出Yolo系列之Yolov5
  • 自旋锁的实现原理

    自旋锁的实现原理 自旋锁的介绍 自旋锁和互斥锁比较相似 xff0c 都是为了实现保护共享资源而提出的一种锁机制 xff0c 在任何一个时刻 xff0c 只有一个执行单元可以获取该锁 xff0c 如果该锁已经被别的单元占用 xff0c 那么调
  • 计算机网络(传输层)

    UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1 慢开始与拥塞避免2 快重传与快恢复 网络层只把分组发送到目的主机 xff0c
  • STM32 USART_Init() 初始化函数中BRR寄存器设置解析

    首先了解一下BRR寄存器的构造 xff1a 可以看到bit15 4设置USARTDIV的整数部分 xff0c bit 3 0设置USARTDIV的小数部分 所以小数部分相当于把1分为16份 xff0c 则DIV Fraction 61 小数
  • 安装libcxsparse3.1.2报错

    报错显示 xff1a yjq 64 yjq sudo apt get install liblapack dev libsuitesparse dev libcxsparse3 1 2 libgflags dev 正在读取软件包列表 完成
  • 网络技术基础(16)

    一 xff1a M HSRP的实施 1 1 HSRP 应用场景 1 路由器物理接口下 2 路由器逻辑子接口 3 xff5d 多层交换机SVI 接口下 1 2 M HSRP 定义 多组的HSRP xff0c 实际上就是一个接口参与多个HSRP
  • windows enable long environment path

    windows gt gpedit msc gt enter Edit Group Policy gt Local Computer Policy gt Computer Configuration gt Administrative Te
  • OpenMV与stm32,msp432等单片机的串口通讯(已经写好一个识别色块的例程,可直接使用)keil(MDK)

    OpenMV与stm32单片机的串口通讯 已经写好一个识别并使单片机得到色块信息的例程 可直接使用 keil MDK 已经写好一个识别色块的例程可直接使用 识别色块 单片机得到色块的中心坐标cx cy 长和高w h及面积s 直接复制源码使用
  • 树莓派python实现http请求控制海康威视摄像头转动

    由于海康威视sdk只支持x86架构处理器 xff0c 所以官方的 so无论无何也连接不上 xff0c 于是在咨询技术售后后 xff0c 我们选择http的方式发送指令控制摄像头在预设点移动 折腾了一天 xff0c 又是cookie啊 xff
  • 【ubuntu】ubuntu20.04安装ros noetic(亲测有效,附操作步骤)

    ubuntu20 04安装ros noetic xff0c 实力踩坑 xff0c 亲测有效 xff01 xff01 xff01 一 安装ROS neotic步骤第一步 xff1a 换源第二步 xff1a 添加ROS软件源第三步 xff1a
  • 【CMake】CMake构建C++代码(一)

    x1f449 博 主 x1f448 xff1a 米码收割机 x1f449 技 能 x1f448 xff1a C 43 43 Python语言 x1f449 公众号 x1f448 xff1a 测试开发自动化 x1f449 专 注 x1f448