使用cmake进行打包,包含可执行程序和动态依赖库

news2024/11/21 1:23:56

  平常代码开发中,有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程,实现使用make -jnproc package指令可以将工程进行打包,可执行文件存储在bin文件夹中,依赖库存储在lib文件夹中。

示例

  • 1.工程目录结构
    • CMakeLists.txt
    • License.txt
    • src
    • include
  • 2.打包后

1.工程目录结构

package_test/
│
├── CMakeLists.txt
│
├── License.txt
│
├── src/
│   ├── main.cpp
│   └── lib.cpp
│
└── include/
    └── lib.h

CMakeLists.txt

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
project(package_test VERSION 1.0)
message("VERSION 1.0.0")

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
add_compile_options("-Wno-unused-variable")

# 指定可执行文件和库文件的输出目录
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
endif()

# 添加库
add_library(mylib SHARED src/lib.cpp)
target_include_directories(mylib PUBLIC include)

# 添加可执行文件
add_executable(${PROJECT_NAME} src/main.cpp)

# 链接库到可执行文件
target_link_libraries(${PROJECT_NAME} PRIVATE mylib)

# 设置RPATH(运行时库搜索路径)
set_target_properties(${PROJECT_NAME} PROPERTIES
    OUTPUT_NAME ${PROJECT_NAME}
    INSTALL_RPATH "\${ORIGIN}/../lib"
)

# 安装规则
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
install(TARGETS mylib DESTINATION lib)

# 包括 CPack 打包配置
include(InstallRequiredSystemLibraries)
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
    set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
    set(CPACK_PACKAGE_VERSION_MAJOR "${package_test_VERSION_MAJOR}")
    set(CPACK_PACKAGE_VERSION_MINOR "${package_test_VERSION_MINOR}")
    set(CPACK_PACKAGE_VERSION_PATCH "${package_test_VERSION_PATCH}")
    set(CPACK_GENERATOR "ZIP")
    set(CPACK_PACKAGE_NAME "package_test")
    set(CPACK_PACKAGE_FILE_NAME package_test-${package_test_VERSION})
    include(CPack)
endif()

License.txt

MIT License

Copyright (c) 2024 boss_dog

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

src

main.cpp

#include <iostream>
#include "../include/lib.h"

int main()
{
    std::cout << "Hello from Main!" << std::endl;
    libFunction();
    return 0;
}

lib.cpp

// lib.cpp
#include "../include/lib.h"
#include <iostream>

void libFunction()
{
    std::cout << "Hello from Library!" << std::endl;
}

include

lib.h

// lib.h
#ifndef LIB_H
#define LIB_H

void libFunction();

#endif

2.打包后

在工程文件夹下执行如下命令:

mkdir build 
cd build 
cmake ..
make -j`nproc` package

会生成package_test-1.0.zip压缩包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

选择自动化工具是一个关键的决策过程

好的自动化软件测试工具&#xff0c;不仅可以有效的缩短全生命周期的交付周期&#xff0c;还可以提高测试的有效性&#xff0c;还可以保证更好的高质量的交付。工具的选型是一项重要的决策过程&#xff0c;工具的采用涉及到企业的效率、成本和长期发展。 1、需求分析 确组织希…

云服务器web环境之mariadb

1.安装mariadb服务 yum install mariadb-server 启动mariadb服务 systemctl start mariadb.service 输入mysql就能使用数据库了。 2.服务相关操作 systemctl stop mariadb.service systemctl restart mariadb.service 2.配置开机自启动 systemctl enable mariadb.serv…

python--5--len()

学习目标&#xff1a; len()#range&#xff0c;list,列表、元组,字符串,包括空格,返回字典的“键值对”个数 学习内容&#xff1a; len()#range&#xff0c;list,列表、元组,字符串,包括空格,返回字典的“键值对”个数 len()--返回对象长度 len()#range&#xff0c;list,列…

matlab学习(三)(4.9-4.15)

一、空域里LSB算法的原理 1.原理&#xff1a; LSB算法通过替换图像像素的最低位来嵌入信息。这些被替换的LSB序列可以是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。 2.实现步骤&#xff1a; &#xff08;1&#xff09;将图像文件中的所有像素点以RGB形…

华为海思数字芯片设计笔试第四套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

1688采集API 接口:轻松实现电商数据采集与官方订单API接口对接

各大平台电商软件大全&#xff0c;优质服务 1688采集API接口&#xff0c;一款助力电商从业者轻松实现阿里巴巴与1688平台商品数据采集接口&#xff0c;在数据为王的电商时代&#xff0c;掌握高效的采集与管理技能&#xff0c;无疑是成功的一把钥匙。 功能概述&#xff1a; 1.…

神经射频脉冲术,破解疼痛之锁

一位十余年糖尿病病史的患者&#xff0c;右足开始出现疼痛和麻木的症状三个多月&#xff0c;给他的生活带来了极大的困扰。他曾在多家医院就诊&#xff0c;但治疗效果并不理想。直到他走进了北京精诚博爱医院&#xff0c;这里为他带来了希望和转机。 经过详细的检查&#xff0c…

分享一款免费阅读的软件:Legado,已免费开源(文末有福利)

对于喜欢阅读的人来说&#xff0c;一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代&#xff0c;再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题&#xff1a;比如广告弹窗太多&#xff0c;排版乱&#xff0c;甚至很多的APP都进入会员时代&#xff0c;再加上一…

使用odbc链接dm8数据库

一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中&#xff0c;没有…

操作系统(Operating System)专题篇——同步与互斥1

目录 0.前言 1.同步与互斥问题总览 2.生产者-消费者问题 2.1 单生产者-单消费者-多资源 2.2 多生产者-多消费者-单资源 2.3 吸烟者问题(单生产者-多消费者-单资源) 2.4 和尚打水问题(多生产者-多消费者-多资源) 3.读写者问题 3.1 读者优先 3.2 写者优先 3.3 过桥问题…

【SpringBoot:详解Bean装配】

&#x1f3e1;Java码农探花&#xff1a; &#x1f525; 推荐专栏&#xff1a;<springboot学习> &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、IoC容器的简介BeanFactory接口源码二、Bean装配扫描装配探索启动类条件装配自定义Bean总…

springboot 人大金仓 kingbase-备份还原,命令中带密码

命令带密码参考 Java代码实现国产人大金仓数据库备份还原需求-CSDN博客文章浏览阅读818次&#xff0c;点赞16次&#xff0c;收藏12次。本人在一次项目中&#xff0c;遇到了需要在系统管理中提供给用户备份还原系统数据的功能&#xff0c;由于项目特殊性&#xff0c;项目底层数…

如何使用电商接口获取商品信息,价格,主图?

1、什么是电商接口&#xff1f; 电商接口是指用于实现电商平台与其他系统之间进行数据交互和功能调的一组规范和方法。通过电商接口&#xff0c;可以实现商品信息的获取、订单管理、支付处理、物流跟踪等功能。 常见的电商接口包括&#xff1a; 商品接口&#xff1a;用于获取…

BLDC的机械角度、电角度与换相时间

6步换相梯形控制&#xff0c;6步一个周期定义为电角度360 总电角度 极对数 * 机械角度 机械角度是指360&#xff0c;一个圆周角&#xff1b; 电角度度指转子转动的角度&#xff0c;从一个N极到下一个N极是360。从N极只到 S极&#xff0c;则转子只运行了180。由于一个电机中通…

Python数据分析案例40——电商直播间成交金额预测

承接上一篇案例电商直播间提取的特征&#xff0c;进而做一篇机器学习的案例&#xff0c;来预测直播间的成交金额。 Python数据分析案例39——电商直播间评论可视化分析&#xff08;LDA&#xff09; 1. 引言 1.1 直播电商与传统电商的比较 直播电商作为一种新兴的电子商务模式…

本地web项目启起来后,无法在浏览器(chrome)看到源码,从而无法打断点;Framework Ignore list

问题描述 本地web项目启起来后&#xff0c;无法在浏览器(chrome)看到源码&#xff0c;从而无法打断点 其他浏览器没看&#xff0c;开发环境一致专注于chrome&#xff08;其余浏览器有测试同事提缺陷了&#xff0c;才会去看&#xff09;&#xff0c;其余浏览器有没有这个问题&…

B端:拖拽功能有哪些框架扩展,用起来爽歪歪。

B端系统拖拽交互功能是指在企业级系统中&#xff0c;用户可以通过拖拽元素来实现交互操作的功能。这种交互方式可以提高用户的操作效率和用户体验&#xff0c;常见的应用场景包括拖拽排序、拖拽调整大小、拖拽改变位置等。 在实现拖拽交互功能时&#xff0c;可以使用多种技术和…

必备工具!16.8k star 的项目!帮助你快速清理重复文件

大家的笔记本是不是都使用了好多年&#xff1f;是不是硬盘里的文件越来越多&#xff0c;尤其是经常有一些重复的文件散落在系统的各个角落&#xff0c;不好找&#xff0c;也很占据空间。今天就给大家介绍一款好用的开源工具&#xff0c;帮助你简单快速的清理电脑里的重复文件—…

Vue3+.NET6前后端分离式管理后台实战(十三)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战&#xff08;十三&#xff09;已经在公众号发布有兴趣的可以关注一下&#xff01; 有兴趣的可以扫码关注&#xff01;

探索网络爬虫:技术演进与学习之路

网络爬虫及IP代理池 前言爬虫技术的演进最新的爬虫技术爬虫技术学习路线 前言 在信息时代&#xff0c;网络爬虫技术作为获取和处理网络数据的重要手段&#xff0c;已经成为数据科学、机器学习和许多商业应用的基石。从简单的HTML页面抓取到复杂的动态内容采集&#xff0c;爬虫…