通过 CMake 制作库文件 静态库 和 动态库

heheda@linux:~/Linux/loveDBTeacher-v2$ tree
.
├── CMakeLists.txt
├── include
│   └── head.h
├── main.c
└── src├── add.c├── div.c├── mult.c└── sub.c

CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h

二、生成静态库 

8.1 制作静态库
add_library(库名称 STATIC 源文件1 [源文件2] ...)在Linux中,静态库名字分为三部分:lib+库名字+.a,此处只需要指定出库的名字就可以了,
另外两部分在生成该文件的时候会自动填充。方法一:
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_library(calc STATIC ${SRC_LIST})方法二:
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc STATIC ${SRC_LIST})这样最终就会生成对应的静态库文件libcalc.a
  • CMakeLists.txt 
cmake_minimum_required(VERSION 3.10)
project(MyProject)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式一: 使用aux_source_directory命令
# aux_source_directory(./src SRC_LIST)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序# 制作库文件
# 1.生成静态库 libcalc.a
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc STATIC ${SRC_LIST})#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
  • CMakeLists.txt  (也可以写成这样)
cmake_minimum_required(VERSION 3.10)
project(MyProject)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式二: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# set(SRC ${PROJECT_SOURCE_DIR}/src) 
set(SRC ${CMAKE_CURRENT_LIST_DIR}/src)
file(GLOB SRC_LIST ${SRC}/*.c)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序# 制作库文件
# 1.生成静态库 libcalc.a
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc STATIC ${SRC_LIST})#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
  • 执行命令: 
执行命令:
1.mkdir build
2.cd build
3.cmake ..
4.make
5.cd ../bin
6./app执行结果:
heheda@linux:~/Linux/loveDBTeacher-v2$ mkdir build
heheda@linux:~/Linux/loveDBTeacher-v2$ cd build
heheda@linux:~/Linux/loveDBTeacher-v2/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/loveDBTeacher-v2/build
heheda@linux:~/Linux/loveDBTeacher-v2/build$ make
Scanning dependencies of target app
[  9%] Building C object CMakeFiles/app.dir/main.c.o
[ 18%] Building C object CMakeFiles/app.dir/src/add.c.o
[ 27%] Building C object CMakeFiles/app.dir/src/div.c.o
[ 36%] Building C object CMakeFiles/app.dir/src/mult.c.o
[ 45%] Building C object CMakeFiles/app.dir/src/sub.c.o
[ 54%] Linking C executable ../bin/app
[ 54%] Built target app
Scanning dependencies of target calc
[ 63%] Building C object CMakeFiles/calc.dir/src/add.c.o
[ 72%] Building C object CMakeFiles/calc.dir/src/div.c.o
[ 81%] Building C object CMakeFiles/calc.dir/src/mult.c.o
[ 90%] Building C object CMakeFiles/calc.dir/src/sub.c.o
[100%] Linking C static library ../lib/libcalc.a
[100%] Built target calc
heheda@linux:~/Linux/loveDBTeacher-v2/build$ cd ../bin
heheda@linux:~/Linux/loveDBTeacher-v2/bin$ ./app
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667
heheda@linux:~/Linux/loveDBTeacher-v2/bin$ 

三、生成动态库

8.2 制作动态库
add_library(库名称 SHARED 源文件1 [源文件2] ...) 
在Linux中,动态库名字分为三部分:lib+库名字+.so,此处只需要指定出库的名字就可以了,
另外两部分在生成该文件的时候会自动填充
方法一:
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_library(calc SHARED ${SRC_LIST})方法二:
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc SHARED ${SRC_LIST})
这样最终就会生成对应的动态库文件libcalc.so8.3 指定输出的路径
​由于在Linux下生成的静态库默认不具有可执行权限,所以在指定静态库生成的路径的时候就
不能使用EXECUTABLE_OUTPUT_PATH宏了,而应该使用LIBRARY_OUTPUT_PATH,这个宏对
应静态库文件和动态库文件都适用file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# 设置动态库/静态库生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 生成动态库
add_library(calc SHARED ${SRC_LIST})
# 生成静态库
add_library(calc STATIC ${SRC_LIST})
  • CMakeLists.txt  
cmake_minimum_required(VERSION 3.10)
project(MyProject)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式一: 使用aux_source_directory命令
# aux_source_directory(./src SRC_LIST)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序# 制作库文件
# 2.生成动态库 libcalc.so
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc SHARED ${SRC_LIST})#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
  • CMakeLists.txt  (也可以写成这样) 
cmake_minimum_required(VERSION 3.10)
project(MyProject)#包含头文件 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
include_directories(${PROJECT_SOURCE_DIR}/include)# 方式二: 使用GLOB命令 注意:PROJECT_SOURCE_DIR 或 CMAKE_CURRENT_SOURCE_DIR
# set(SRC ${PROJECT_SOURCE_DIR}/src) 
set(SRC ${CMAKE_CURRENT_LIST_DIR}/src)
file(GLOB SRC_LIST ${SRC}/*.c)
add_executable(app main.c ${SRC_LIST}) # 生成可执行的程序# 制作库文件
# 2.生成动态库 libcalc.so
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(calc SHARED ${SRC_LIST})#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏

执行命令:
1.mkdir build
2.cd build
3.cmake ..
4.make
5.cd ../bin
6./app执行结果:
heheda@linux:~/Linux/loveDBTeacher-v2$ mkdir build
heheda@linux:~/Linux/loveDBTeacher-v2$ cd build
heheda@linux:~/Linux/loveDBTeacher-v2/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/loveDBTeacher-v2/build
heheda@linux:~/Linux/loveDBTeacher-v2/build$ make
Scanning dependencies of target app
[  9%] Building C object CMakeFiles/app.dir/main.c.o
[ 18%] Building C object CMakeFiles/app.dir/src/add.c.o
[ 27%] Building C object CMakeFiles/app.dir/src/div.c.o
[ 36%] Building C object CMakeFiles/app.dir/src/mult.c.o
[ 45%] Building C object CMakeFiles/app.dir/src/sub.c.o
[ 54%] Linking C executable ../bin/app
[ 54%] Built target app
Scanning dependencies of target calc
[ 63%] Building C object CMakeFiles/calc.dir/src/add.c.o
[ 72%] Building C object CMakeFiles/calc.dir/src/div.c.o
[ 81%] Building C object CMakeFiles/calc.dir/src/mult.c.o
[ 90%] Building C object CMakeFiles/calc.dir/src/sub.c.o
[100%] Linking C shared library ../lib/libcalc.so
[100%] Built target calc
heheda@linux:~/Linux/loveDBTeacher-v2/build$ cd ../bin
heheda@linux:~/Linux/loveDBTeacher-v2/bin$ ./app
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667
heheda@linux:~/Linux/loveDBTeacher-v2/bin$ 

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

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

相关文章

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历,中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

NetDevOps:华三交换机通过Netmiko或者Nornir获取接口信息通过TextFSM解析报错问题

python代码:实现功能获取交换机接口信息并通过TextFSM进行解析。 from netmiko import Netmiko import textfsm show_intf_cmd_mapping {hp_comware: display interface, }def ssh_device_2_get_intfs(device_type, host, username, password, port):dev_info {d…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多,为什么我们会选择Prometheus而不是其他软件呢? 因为它有以下优点: 自带简易web监控页面,用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警;具有丰…

Java SPI在数据库驱动、SpringBoot自动装配中的应用

文章目录 1. 初识SPI1.1 SPI的作用1.2 SPI的工作原理1.3 SPI的三个组件:Service、Service Provider、ServiceLoader1.4 SPI使用场景1.5 具体的SPI 源码分析(SPI的核心就是ServiceLoader.load()方法)1.6 SPI 的优缺点 2. API、SPI、JNDI释义3.…

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的,所以自己来总结下 需求: 常见的上方tag标签切换,下方是页面,上面点击切换,下面页面也切换,下方列表有下拉刷新,触底加载更多 因为这两个组件都是固定高度的,…

6.2 声音编辑工具GoldWave5简介(6)

3.选择【选项】|【控制器属性】命名或单击“控制器”面板上的“设置控制器属性”按钮,打开“控制器属性”对话框,将“音量”选项卡中的“麦克风”选项打上勾,使GoldWave只能录制来自麦克风的声音。如果要录制电脑内部的声音&#…

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务,来接收一个POST请求,这个请求中就会涵盖实时的数据,包括昵称、消息内容、消息类型之类的。 p…

Head First Design Patterns -工厂模式

什么是工厂模式 工厂方法模式定义了一个创建对象的接口,但由子类来决定要实例化那个类。工厂方法让类把实例化推迟到了子类。 为什么要有工厂模式 书中以pizza店制作pizza为例子,假设不用工厂模式,在制作pizza阶段我们需要这样去实例化类&am…

回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现

回声状态网络(Echo State Networks,ESN)详细讲解及Python代码实现 1 基本概念 回声状态网络是一种循环神经网络。ESN 训练方式与传统 RNN 不同。网络结构如下图: (1)储层(Reservoir)&#x…

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容: {"tags": {"all…

在Linux中创建文件的多种方法

目录 前言1 使用重定向符号 ">"2 使用文本编辑器 vi/vim3 使用 nano4 使用 echo5 使用 touch6 使用 printf7 使用 head8 使用 cat9 使用 tail10 使用 truncate结语 前言 在Linux系统中,文件的创建是日常操作中不可避免的一部分。无论是创建空文件、编…

解决MPICH的GPU初始化失败:一次深入探索

今天来分享“MPICH:MPII_Init_thread(222): gpu_init failed”这个问题的解决方式 文章目录 前言问题原因解决方案 前言 如果在安装MPICH的时候没有注意要一些选项,那么当使用mpicxx mpi_send.cpp -o send && mpirun -n 2 ./send进行编译输出的…

图片特效/增强GUI程序

程序下载地址:mendianyu/pictureConvert: 图片特效/增强GUI程序,借助百度接口实现人像动漫化,模糊图片变清晰等等功能 (github.com) 图片特效/增强GUI程序 借助百度接口实现人像动漫化,模糊图片变清晰等等功能 程序介绍 运行Ima…

LIS系统:样本采集、检验、分析、查看报告

检验科LIS系统是实验室信息管理系统,主要用于实验室检验工作流程管理、病人信息管理、检验结果查询、统计和报表打印等功能。它采用智能辅助功能,自动接收检验数据、打印检验报告,并保存检验信息的工具。同时,可根据实验室需要实现…

opencv(C++)基础用法

文章目录 前言一、opencv (C)图片基本操作1.1 读取图片并显示1.2 颜色转换1.3 图像filtering1.4 形状调整1.5 绘制 二、读取视频文件并显示三、RTSP 视频流四. 人脸检测总结 前言 学习笔记 一、opencv (C)图片基本操作 1.1 读取图片并显示 #include "opencv2/opencv.hp…

二、Java中SpringBoot组件集成接入【MySQL和MybatisPlus】

二、Java中SpringBoot组件集成接入【MySQL和MybatisPlus】 1.MySQL和MybatisPlus简介2.maven依赖3.配置1.在application.yaml配置中加入mysql配置2.新增Mybatis-Plus配置类 4.参考文章 1.MySQL和MybatisPlus简介 MySQL是一种开源的关系型数据库管理系统,被广泛应用…

Python——猜猜心里的数字(1)

首先呢,我们自定义一个数字,然后让对方猜一猜是否能猜中,接下来我们以10为例,给对方三次机会。 num10 if int(input("请猜一个数字:"))num:print("恭喜第一次就猜对了") elif int(input("猜错了&#x…

每日一题——LeetCode1128.等价多米诺骨牌对的数量

先尝试暴力解法&#xff1a; var numEquivDominoPairs function(dominoes) {var count0for(let i0;i<dominoes.length-1;i){for(let ji1;j<dominoes.length;j){if((dominoes[i][0]dominoes[j][0] && dominoes[i][1]dominoes[j][1]) || (dominoes[i][0]dominoes…