cmake模板-支持编译动态/静态文件

news2025/1/13 7:38:26

代码链接:代码仓库

git clone https://gitee.com/etsuyou/cmake-template.git

模板

模板截图
在这里插入图片描述

如何使用

在src和inc中写代码

此处用我默认提供的代码
在这里插入图片描述

./go.sh cmake 生成Makefile

在这里插入图片描述

./go.sh make 生成bin文件和.a以及.so

在这里插入图片描述

./go.sh run app 运行

在这里插入图片描述

./go.sh clean 以及 ./go.sh clean-all 清理build中的内容

在这里插入图片描述

./go.sh -h -help --help 查看帮助

在这里插入图片描述

代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(CTEST)
set(CMAKE_C_STANDARD 11)
include_directories(inc)

file(GLOB_RECURSE SOURCES
    src/*.c
)
list(FILTER SOURCES EXCLUDE REGEX "src/math/.*")

set(MATH_SOURCES
    src/math/add.c
    src/math/minus.c
)

option(BUILD_STATIC "Build static library" ON)
option(BUILD_SHARED "Build shared library" ON)
set(BUILD_TYPE "shared" CACHE STRING "Choose the build type: static, shared, or none")

set(GENERATED_LIB_DIR_NAME lib)
set(GENERATED_PROGRAM_NAME app)

set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${GENERATED_LIB_DIR_NAME})
set(LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${GENERATED_LIB_DIR_NAME})

if(BUILD_STATIC)
    add_library(math_static STATIC ${MATH_SOURCES})
    set_target_properties(math_static PROPERTIES
        ARCHIVE_OUTPUT_DIRECTORY ${ARCHIVE_OUTPUT_DIRECTORY}  
    )
endif()

if(BUILD_SHARED)
    add_library(math_shared SHARED ${MATH_SOURCES})
    set_target_properties(math_shared PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_DIRECTORY}  
    )
endif()

add_executable(${GENERATED_PROGRAM_NAME} ${SOURCES})

if(BUILD_TYPE STREQUAL "none")
    # do nothing
elseif(BUILD_TYPE STREQUAL "static")
    target_link_libraries(app math_static)
elseif(BUILD_TYPE STREQUAL "shared")
    target_link_libraries(app math_shared)
else()
    # do nothing
endif()

# 添加一个自定义的 clean 目标
add_custom_target(clean-all
    COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_BINARY_DIR}/*
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/CMakeFiles
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/${GENERATED_LIB_DIR_NAME}
    COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/CMakeCache.txt
    COMMENT "Cleaning all build files while preserving the build directory"
)

# 你可以选择将 clean-all 目标添加到默认的清理操作中
# set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_BINARY_DIR}")

message(STATUS "All tasks finished!")

go.sh

#!/bin/bash

# 显示帮助信息的函数
show_help() {
    echo "用法: $0 <cmake|make|clean|clean-all|run> [app]"
    echo ""
    echo "选项:"
    echo "  cmake      进入 build 目录并运行 cmake .."
    echo "  make       进入 build 目录并运行 make"
    echo "  clean      进入 build 目录并运行 make clean"
    echo "  clean-all  进入 build 目录并运行 make clean-all"
    echo "  run app    进入 build 目录并运行 ./app (app 是可执行文件的名称)"
    echo "  -h, --help, -help   显示此帮助信息"
}

# 检查参数数量
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
    echo "用法: $0 <cmake|make|clean|clean-all|run> [app]"
    exit 1
fi

# 检查帮助参数
if [[ "$1" == "-h" || "$1" == "--help" || "$1" == "-help" ]]; then
    show_help
    exit 0
fi

# 进入 build 目录
if [ ! -d "build" ]; then
    mkdir build
fi
cd build || exit

# 根据参数执行相应的命令
case "$1" in
    cmake)
        cmake ..
        ;;
    make)
        make
        ;;
    clean)
        make clean
        ;;
    clean-all)
        make clean-all
        ;;
    run)
        if [ -z "$2" ]; then
            echo "错误: 运行应用程序时需要提供应用程序名称。"
            echo "用法: $0 run <app>"
            exit 1
        fi
        ./"$2"
        ;;
    *)
        echo "无效的参数: $1"
        echo "用法: $0 <cmake|make|clean|clean-all|run> [app]"
        exit 1
        ;;
esac

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

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

相关文章

Tomcat服务部署及优化

一、Tomcat的基本介绍 1. tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

QT QML 练习8-Simple Transformations

简单的转换&#xff08;Simple Transformations&#xff09; 转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移&#xff0c;旋转&#xff0c;缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始…

Python学习100天第9天之面向对象进阶

1 前言 在前面的章节我们已经了解了面向对象的入门知识&#xff0c;知道了如何定义类&#xff0c;如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发&#xff0c;我们还需要对Python中的面向对象编程进行更为深入的了解。 2 property装饰器…

AVLTree 旋转笔记(根据平衡因子插入的公式,贼好理解)

平衡因子 avltree是一棵每个节点的左右子树的高度差不超过1的二叉树搜索树&#xff0c;对于avltree最重要的就是对平衡因子的控制。 对于旋转我们重点要注意的是三个节点&#xff0c;以左旋举例&#xff0c;需要注意的就是parent&#xff0c;subr&#xff0c;subrl。而旋转的方…

MYSQL架构、执行过程和顺序

MYSQL架构、执行过程和顺序 一、前言 1.1、说明 就MySQL的架构&#xff0c;以及执行过程、sql执行顺序&#xff0c;以及一些相关学习分享内容。 在参考文章的基础上&#xff0c;会增加自己的理解、看法&#xff0c;希望本文章能够在您的学习中提供帮助。 如有错误的地方&a…

Dokcer如何容器部署及常见问题

本文讲解通过Docker部署Jenkins过程及遇到的问题。 通过 Docker 部署 Jenkins 使用 Docker 来部署 Jenkins 是一个快速且高效的方式。以下是使用 Docker 部署 Jenkins 的分步骤指南&#xff1a; 1. 安装 Docker 如果你的系统上还没有安装 Docker&#xff0c;请根据操作系统…

春日技术问答:Spring Boot课程答疑

3系统分析 3.1可行性分析 通过对本课程答疑系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本课程答疑系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

【2D/3D-Lidar-SLAM】 Cartographer详细解读

【2D/3D-Lidar-SLAM】 Cartographer详细解读 1. 摘要 2. Cartographer系统数据处理流程2.1. 数据获取&#xff08;Input Sensor Data&#xff09;2.2 姿态外推器&#xff08;PoseExtrapolator&#xff09;2.3 局部建图&#xff08;Local SLAM&#xff09; 3. 关键模块实现 3.1 …

5、springboot-基础入门

1、系统要求 Java 8 & 兼容java14 .Maven 3.3idea 2019.1.2 1.1、maven设置 修改maven的settings.xml文件中的镜像&#xff0c;如下 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyu…

vue3 在store的index.js

导入vuex&#xff0c;在store的index.js创建store对象 在main.js挂载store import store from ./storenew Vue ({/* 将store对象实例挂载到vue实例中 所有组件就可以直接从store中获取全局数据了*/ store, render: h > h(App) }).$mount(#app) 在store中的index.js进行声明…

【IPv6】IPv6 NAT66介绍

参考链接 IPv6-to-IPv6 Network Address Translation (NAT66) (ietf.org)https://datatracker.ietf.org/doc/id/draft-mrw-nat66-00.html IPv6 NAT66 NAT66&#xff0c;全称为Network Address Translation for IPv6 to IPv6&#xff0c;是一种用于IPv6网络的地址转换技术。在…

FPGA基于SRIO Auraro 三速以太网 IIC SPI等多协议的高速传输处理项目

高速传输处理项目 此项目涉及较多协议和接口&#xff0c;有较复杂的系统顶层框图设计。在涉及设备较多的应用场景中&#xff0c;需要涉及一款PCI-E板卡&#xff0c;将多个子系统的数据汇总上传到PC或服务器上。在此项目中有3路数据源&#xff0c;分别是:srio数据&#xff0c; …

数据结构与算法:动态规划的深度探讨

目录 12.1 动态规划的核心思想 12.2 经典动态规划问题 12.3 动态规划在图中的应用 12.4 高级动态规划技术 总结 数据结构与算法&#xff1a;动态规划的深度探讨 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种解决复杂问题的有效方法&#xff0c;特别适…

Nuxt3部署-Ubuntu系统(Node 服务 + pm2 + Nginx 反向代理)

Nuxt3部署-Ubuntu系统&#xff08;Node 服务 pm2 Nginx 反向代理&#xff09; 文章目录 Nuxt3部署-Ubuntu系统&#xff08;Node 服务 pm2 Nginx 反向代理&#xff09;一、安装 Nodejs 环境二、安装 Nginx三、安装 pm2四、本地项目打包1️⃣&#xff1a;打包2️⃣&#xff1…

【截流软件】采集短视频关键词笔记下的筛选评论

用python开发的dy采集工具【爬抖Y搜索评论软件】&#xff0c;可用于引流截流等。 支持2种模式的评论采集&#xff1a; 根据关键词采集评论&#xff0c;爬取思路&#xff1a;作品关键词->作品链接->评论根据作品链接采集评论&#xff0c;爬取思路&#xff1a;作品链接-&g…

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理

aws(学习笔记第六课) AWS的虚拟私有&#xff0c;共有子网以及ACL&#xff0c;定义公网碉堡主机子网以及varnish反向代理 学习内容&#xff1a; AWS的虚拟私有&#xff0c;共有子网以及ACL定义公网碉堡主机子网&#xff0c;私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…

分享一个中国行政区划多边形2024版(含有十段线)

全国省市县三级行政区划分类 全国有省市县界限数据 十段线 有需要自取

[Linux系统编程] 线程同步(互斥锁,读写锁,死锁,条件变量,信号量)

一.线程同步概念 线程同步&#xff1a; 协同步调&#xff0c;对公共区域数据按序互斥访问。防止数据混乱&#xff0c;产生与时间有关的错误。 数据混乱的原因&#xff1a; 1.资源共享(独享资源则不会) 2.调度随机(意味着数据访问会出现竞争)—线程间竞争 3.线程间缺乏必要同步…

一篇闪击常用放大器电路(学习笔记)

文章目录 声明概念名词经典电路分析反向放大器同向放大器加法器减法器积分电路微分电路差分放大电路电流->电压转换电路电压->电流转换电路 虚短与虚断一、虚短二、虚断 一些碎碎念 声明 ​ 本文是主要基于以下两篇博客所做的笔记&#xff1a; 模电四&#xff1a;基本放…

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

图论day60|108.冗余连接&#xff08;卡码网&#xff09;、109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁信心的一题&#xff0c;胆小的走开&#xff01;】 108.冗余连接&#xff08;卡码网&#xff09;109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁…