CMake编译安装、生成可执行程序、生成静态动态库以及静态动态库的链接

1 CMake介绍

  • CMake是一个开源的、跨平台的构建系统,用于管理软件从源代码到可执行文件的整个构建过程。它最初由Kitware公司为ITK(Insight Segmentation and Registration Toolkit)和VTK(Visualization Toolkit)等开源项目开发,后来成为了一个独立的开源项目。
  • CMake的设计目标是让开发者能够以一种简单、统一的方式编写构建规则,这些规则可以在多种操作系统和编译器环境下工作,从而实现代码的跨平台编译。

2 CMake安装

  • CMake包下载地址

2.1 Linux平台安装

  • 以ubuntu 20.04 版本为例

2.1.1 命令行安装

  • apt install cmake

2.1.2 源码编译安装

  • 安装编译工具和依赖库
    •   sudo apt install g++sudo apt install makesudo install libssl-dev
      
  • 下载源码
    • 以3.28.5版本为例,下载这个源码包 cmake-3.28.5.tar.gz
  • 编译安装
    • 解压后进入cmake源码目录,执行以下命令编译安装
    •   ./configuire# 编译make -j4# 默认会安装到/usr/local/share目录下make install
      
  • 查看版本
    • 安装完成后重新打开终端,执行cmake -version就可以看到当前安装的版本。
    •   cmake version 3.28.5CMake suite maintained and supported by Kitware (kitware.com/cmake).
      
  • 设置环境变量
    • 如果安装后执行cmake -version看不到版本,可能是环境变量没有设置进去
    • 打开 ~/.bash_profile 在文件末尾添加以下内容
    •   export PATH=/usr/local/share/cmake-3.28
      

2.2 Windows平台安装

  • 下载windows平台安装包 cmake-3.28.5-windows-x86_64.msi
  • 下载后直接双击安装
    • 安装过程中会让你选择是否设置环境变量,这里就选择设置系统环境变量。
    • 在这里插入图片描述
    • 默认会安装到 C:\Program Files\CMake目录下
    • 安装完成后,打开cmd命令行工具,执行cmake -version就可以看到当前安装的CMake版本

3 CMake生成可执行程序

  • 文件结构
    •   ├── build├── CMakeLists.txt└── src└── main.cpp
      
  • build目录: 编译目录
  • src目录: 存放源文件的目录
  • CMakeLists.txt文件内容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 构建项目的名称project(cmake_first_demo)# 构建执行程序# PROJECT_SOURCE_DIR 是CMake的一个系统变量,表示当前工程目录,即CMake所在目录add_executable(cmake_first_demo ${PROJECT_SOURCE_DIR}/src/main.cpp)
      

3.1 Windows平台

  • 构建项目

    •   # 构建项目,在build目录下执行,此命令会使用默认编译器构建项目# ..表示上一级目录cmake ..# 或者通过-G参数,指定编译器构建项目cmake -G "Visual Studio 14 2015" ..
      
  • 构建项目时指定生成项目文件路径

    • 上面是手动创建了一个build项目来创建工程,还可以构建项目时自动创建目录
    • 在 CMakeLists.txt 所在目录下执行
    •   	# -S 指定CMakeLists.txt 文件所在目录# -B 指定工程文件生成目录cmake -S . -B build_x86
      
  • 编译可执行程序

    • 构建项目成功后,在build目录下会生成工程文件,可以用Visual Studio 编译器打开sln后缀的文件。选择工程,点击生成,在build/Release目录下就可以生成可执行程序。

    • 在这里插入图片描述

    • 在这里插入图片描述

    • 也可以不用打开编译器,直接在build目录下执行以下命令

    •   # 默认生成Debug程序,通过--config可指定生成Release程序cmake --build ./ --config Release
      
    • 在build/Release 目录下也会生成可执行程序

3.2 Linux平台

  • CMake支持跨平台,因此在其Linux平台也可以直接编译,和Windows差别不大
  • 构建项目
    •   # 在build目录下执行cmake ..
      
    • 执行后会在build目录下生成以下工程文件,工程文件和Windows平台是不一样的。
    • 在这里插入图片描述
  • 编译可执行程序
    • 直接执行make命令生成可执行程序
    • 在这里插入图片描述

4 CMake生成静态库

  • 文件结构
    •   ├── build├── CMakeLists.txt└── src├── mymath.cpp└── mymath.h
      
  • CMakeLists.txt文件内容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 构建项目的名称project(mymath_demo)# 指定头文件路径include_directories(${PROJECT_SOURCE_DIR}/src)# 生成库文件(静态库)add_library(mymath_demo STATIC ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
      
  • mymath.h文件内容
    •   #ifndef __MY_MATH_H__#define __MY_MATH_H__int mymath_add(int a, int b);#endif
      
  • mymath.cpp文件内容
    •   #include "mymath.h"int mymath_add(int a, int b){return a + b;}
      

Windows平台

  • 在build目录下执行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目录下就会生成静态库文件
    • 在这里插入图片描述

Linux平台

  • 在build目录下分别执行以下命令
    •   cmake ..make
      
  • 就会生成对应的静态库文件 libmymath_demo.a
    • 在这里插入图片描述

5 CMake链接静态库

  • 文件结构
    •   ├── build├── CMakeLists.txt├── mymath│   ├── gcc_x64│   │   └── libmymath_demo.a│   ├── include│   │   └── mymath.h│   └── vc_x86│       └── mymath_demo.lib└── src└── main.cpp
      
  • mymath目录下的头文件和库文件,是在步骤4中编写和生成的,拷贝过来。
  • CMakeLists.txt文件内容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 构建项目的名称project(myproject)# 指定头文件路径include_directories(${PROJECT_SOURCE_DIR}/mymath/include)# 指定库文件路径IF(WIN32)link_directories(${PROJECT_SOURCE_DIR}/mymath/vc_x86)ELSEIF(UNIX)link_directories(${PROJECT_SOURCE_DIR}/mymath/gcc_x64)ENDIF()# 生成可执行程序add_executable(myproject ${PROJECT_SOURCE_DIR}/src/main.cpp)# 链接库target_link_libraries(myproject mymath_demo)
      
  • main.cpp文件内容
    •   #include <stdio.h>#include "mymath.h"int main(){int sum = mymath_add(10, 20);printf("sum = %d\n", sum);return 0;}
      

Windows平台

  • build目录下执行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目录下会生成可执行程序

Linux平台

  • build目录下执行
    •   cmake ..make
      
  • 在build目录下会生成可执行程序

6 CMake生成动态库

  • 生成动态库时,使用步骤4中的代码工程。
  • 将CMakeLists.txt文件最后一行做修改,指定生成动态库
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 构建项目的名称project(mymath_demo)# 指定头文件路径include_directories(${PROJECT_SOURCE_DIR}/src)# 生成库文件(动态库)add_library(mymath_demo SHARED ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
      

Windows平台

  • 需要注意的是,Windows平台链接动态库时,需要先找到lib文件
  • 因此对 mymath.h 文件做修改,生成动态库的同时需要生成lib文件
    •   #ifndef __MY_MATH_H__#define __MY_MATH_H__// 导出接口到lib文件中int __declspec(dllexport) mymath_add(int a, int b);#endif
      
  • build目录下执行以下命令编译
    •   cmake ..cmake --build . --config Release
      
  • 会生成lib和dll文件
    • 在这里插入图片描述

Linux平台

  • 直接在build目录下执行命令编译就可以生成动态库
    •   cmake ..make
      
  • 生成了动态库文件
    • 在这里插入图片描述

7 CMake链接动态库

  • 使用步骤5中的代码工程
  • 链接动态库时,不用做任何修改,只需要将静态库文件替换为动态库文件即可。
  • 目录结构如下
    •   ├── build├── CMakeLists.txt├── mymath│   ├── gcc_x64│   │   └── libmymath_demo.so│   ├── include│   │   └── mymath.h│   └── vc_x86│       ├── mymath_demo.dll│       └── mymath_demo.lib└── src└── main.cpp
      

Windows平台

  • build目录下执行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目录下会生成可执行程序
  • 运行时需要将 mymath_demo.dll 和可执行程序放到同一个目录下。

Linux平台

  • build目录下执行
    •   cmake ..make
      
  • 在build目录下会生成可执行程序

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

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

相关文章

在Linux kali下载、安装Perl环境

目录 Perl介绍 下载安装 官网下载 在Windows安装 在Linux和Mac OS安装 Perl介绍 Perl一种功能丰富的计算机程序语言&#xff0c;运行在超过100种计算机平台上&#xff0c;适用广泛&#xff0c;从最初是为文本处理而开发的&#xff0c;现在用于各种任务&#xff0c;包括系统…

C语言编程数学:探索、挑战与深度应用

C语言编程数学&#xff1a;探索、挑战与深度应用 C语言&#xff0c;作为计算机编程的基石之一&#xff0c;不仅广泛应用于系统级编程&#xff0c;还在数学计算领域发挥着重要作用。本文将围绕C语言在数学编程中的四个方面、五个方面、六个方面和七个方面展开探讨&#xff0c;带…

面试官:Spring中都应用了哪些设计模式?

设计模式是我们项目中经常会涉及到的项目进行重构、解构时的一种方法。 比如我们常见的单例模式、工厂模式、策略模式、装饰器模式等都是比较常用的&#xff1b;关于 23 种设计模式&#xff0c;大家可以找本书专门去学习一下&#xff0c;在 Java 框架的源码中也不例外&#xf…

SRE养成计划之01-基本命令(持续更新)

基本命令&#xff08;续&#xff09; 软连接 软连接 --> 原始文档 --> 文档数据格式&#xff1a;ln -s 原始文件或目录 软连接文件若原始文件或目录被删除&#xff0c;链接文件将失效软连接可存放在不同分分区/文件系统 硬链接 硬链接 --> 文档数据格式&#xff1…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

C++20实战之channel

C20实战之channel 继前面两节的直播&#xff0c;讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现&#xff0c;那么如何基于这些知识实现一个小项目呢&#xff1f; 于是引出了这篇&#xff0c;写一个channel出来。 注&#xff1a…

【算法】快速幂

算法-快速幂 前置知识 倍增 思路 我们要求 a n a^n an。 简单的方法是 a n a n − 1 ⋅ a a^na^{n-1}\cdot a anan−1⋅a 但是我们不妨使用倍增的思想 若 2 ∣ n 2\mid n 2∣n&#xff0c;则 a n a n 2 2 a^n{a^{\frac n 2}}^2 ana2n​2 若 2 ∤ n 2\nmid n 2∤n&…

【AI】设计师人人必备的Ai课程,AIGC实战教学

课程介绍 专为设计师定制的AI绘画视觉课程&#xff0c;包含排版、插画、海报和动漫等。共43节课程&#xff0c;2.06G视频&#xff0c;教授AI应用技巧&#xff0c;提高设计效率和质量。内容涵盖词生图方法、AI风格设计等&#xff0c;帮助学员在设计领域取得成就。 1_01-ai课程…

Flutter 中的 SliverPersistentHeader 小部件:全面指南

Flutter 中的 SliverPersistentHeader 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 工具集&#xff0c;用于创建美观、高性能的移动和 web 应用。在 Flutter 的滚动组件中&#xff0c;SliverPersistentHeader 是一个特殊的组件&#xff0c;它用于在 CustomScroll…

zustand修改一个object对象的嵌套属性,会触发更新吗

在 Zustand 状态管理库中&#xff0c;当使用 set 方法来更新一个对象的嵌套属性时&#xff0c;并不会触发整个对象的更新操作。相反&#xff0c;Zustand 使用了浅比较来检测状态的变化&#xff0c;只有当状态内部的引用发生变化时&#xff0c;才会触发更新操作。 因此&#xf…

jrt落地deepin

经过昨天一晚上的努力&#xff0c;把deepin和win10的双系统安装好了。同时把jrt开发需要的svn&#xff0c;jdk,idea安装好里&#xff0c;代码也checkout里。 首先安装系统碰到安装deepin后启动时候无法选择win10,在宏伟兄帮助下找到资料执行sudo update-grub解决了。 然后程…

糖果促销【百度之星】/思维

糖果促销 思维 大佬的解法&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll t;cin>>t;for(int i0;i<t;i){ll p,k;cin>>p>>k;if(k0) cout<<0<<endl;else{k-(k-1)/p;cout<<k<…

v-for中key的作用

v-for中key的作用 例如我们用v-for渲染一个列表[1, 2, 4 ,5]&#xff0c;然后在中间插入一个3变成[1,2,3,4,5]。v-for写了key和没有写key&#xff0c;Vue是怎么处理的呢&#xff1f; Vue对有key的会调用patchKeyedChildren方法&#xff1b;没有key的调用patchUnkeyedChildren方…

Vue3 -Computed计算属性

前言&#xff1a; Computed属性属于Vue3中的响应式核心(与之共同说明的还有ref&#xff0c;reactive&#xff0c;watch...) 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set…

AI搜索,围攻百度

图片&#xff5c;电影《双子杀手》截图 ©自象限原创 作者丨程心 国内的大模型厂商落地C端&#xff0c;都盯上了AI搜索。 随着5月30号&#xff0c;腾讯宣布推出基于混元大模型的APP“腾讯元宝”&#xff0c;并基于搜狗搜索引擎&#xff0c;上线AI搜索功能。几乎当下所有…

【Qt】Qt Style Sheets (QSS) 指南:打造个性化用户界面

文章目录 前言&#xff1a;1. QSS 选择器2. 子控件选择器&#xff08;Sub-Controls&#xff09;2.1. 示例&#xff1a;给 QComboBox 给下拉按钮加上图标2.2. 示例&#xff1a;修改进度条颜色 3. 伪类选择器3.1. 代码示例: 设置按钮的伪类样式.3.2. 代码示例: 使用事件方式实现同…

数模混合芯片设计中的修调技术是什么?

一、修调目的 数模混合芯片需要修调技术主要是因为以下几个原因&#xff1a; 工艺偏差&#xff08;Process Variations&#xff09;&#xff1a; 半导体制造过程中存在不可避免的工艺偏差&#xff0c;如晶体管尺寸、阈值电压、电阻和电容值等&#xff0c;这些参数的实际值与…

阿里云计算之linux入门命令学习笔记(三)

Linux 提供了丰富的命令行工具&#xff0c;用于系统管理、文件操作、网络管理、进程控制等。以下是一些常用的 Linux 命令及其简要说明&#xff1a; 切换用户 su 命令 su (substitute user) 命令用于切换用户。 su - username # 切换到指定用户&#xff0c;并加载…

【学习Day5】操作系统

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 学习编辑文章的时间不太够用&#xff0c;先放思维导图&#xff0c;后续复习完善细节。

【C++】6-6 你好,输出的格式控制(对齐)

6-6 你好&#xff0c;输出的格式控制&#xff08;对齐&#xff09; 分数 10 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序&#xff1a;按示例格式输出所有分数&#xff0c;分数保留2位小数&#xff0c;分数左对齐输出在两根竖线之间 裁判测试程序样例&#xff1…