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

news2024/9/25 3:25:27
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.so

8.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.coloradmin.cn/o/1380366.html

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

相关文章

Linux学习记录——사십이 高级IO(3)--- Poll型服务器

文章目录 1、认识poll接口2、实现3、特点 1、认识poll接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);// pollfd结构 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned…

三、电脑软件路径移动方式

一、电脑文件移动 当我们想整理硬盘或者移动软件时&#xff0c;常常会遇到多种多样的问题&#xff0c;下面就来说明一下我遇到的问题 1.桌面 解释&#xff1a;移动路径会导致桌面快捷方式失效&#xff0c;下面以图片解答如何恢复 原理&#xff1a;桌面快捷方式保存在C:\Users…

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

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

AI手写数字识别(一)

使用Visual Studio Tools for AI加速桌面智能应用开发 主要知识点 典型的AI应用的代码结构和功能&#xff0c;如处理输入;使用Visual Studio Tools for AI进行TensorFlow模型到.Net Framework应用环境的快速集成。 简介 本文将介绍一例"手写数字识别应用"的开发过…

线性代数——行列式相关性质

目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行&#xff08;列&#xff09;&#xff0c;行列式变号 三、行列式某行&#xff08;列&#xff09;有公因子k&#xff0c;则k可以提到行列式外 四、行列式中若两行成比例&#xff0c;则行列式为0 五、行列式的某一行…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器&#xff08;源码&#xff09;&#xff0c;好奇下&#xff0c;试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格&#xff08;数据来自网络&#xff0c;如果发现有误请联系QQ149…

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(16)——可变数据类型&#xff08;var&#xff09;的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

【文末送书】语义解析:连接自然语言与机器智能的桥梁

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

R语言【paleobioDB】——pbdb_collections():通过参数选择,返回多个采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_collections (...) Arguments 参数【...…

2024趋势:ERP中数据分析的五大要点

2024 年&#xff0c;数据分析不仅仅是 ERP 实施中的一个额外功能;这就像第一步&#xff0c;将最终确定整个 ERP 实施项目的成功之路。忘记笨重的电子表格和无休止的报告——准备好驾驭这五种新兴趋势的浪潮&#xff1a; 一、人工智能和机器学习 (ML) 的兴起 人工智能驱动的数据…

PiflowX-DorisRead组件

DorisRead组件 组件说明 从Doris存储读取数据。 计算引擎 flink 有界性 目前Doris Source是有界流&#xff0c;不支持CDC方式读取。 组件分组 Doris 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述…

java使用itext7实现html转pdf全代码完整示例

之前项目有个需求&#xff0c;系统实现自己的打印功能&#xff0c;基本上都是前端找了个框架搞的&#xff0c;我呢&#xff0c;就是配合处理一些前端不好处理的部分&#xff0c;但是新一期的需求评审中&#xff0c;前端提出了&#xff0c;前端自己生成pdf在数据量大的时候会很慢…

前端基础知识整理汇总(上)

HTML页面的生命周期 HTML页面的生命周期有以下三个重要事件&#xff1a; DOMContentLoaded —— 浏览器已经完全加载了 HTML&#xff0c;DOM 树已经构建完毕&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 load —— 浏览器已经加载了所有的资源&…

C语言宏定义小技巧

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒&#xff08;除闰年&#xff09;举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

商城小程序系统:数字化转型下的商机

近几年&#xff0c;电商行业不断发展&#xff0c;线上购物已经成为大众的重要选择。线上商超作为传统的商业购物模式&#xff0c;为带来更多的商机&#xff0c;也逐渐转向了线上电商模式&#xff0c;越来越多的商超企业开始搭建专属的商城小程序&#xff0c;为消费者提供方便快…

适用于动态 IT 环境的服务器流量监控软件

服务器在网络性能中起着至关重要的作用&#xff0c;这意味着保持其最佳容量至关重要。企业需要将 AI、ML 和云技术融入其 IT 中&#xff0c;从而提供充分的敏捷性、安全性和灵活性&#xff0c;在这方面&#xff0c;服务器流量监控已成为当务之急。通过定期监控通信、跟踪流量上…

《Linux C编程实战》笔记:线程同步

这一节主要是解决共享资源的处理。操作系统里也讲过互斥、锁之类的概念。 互斥锁 互斥锁通过锁机制来实现线程同步&#xff0c;同一时刻只允许一个线程执行一个关键部分的代码 一下是操作互斥锁的函数&#xff0c;均声明在pthread.h中。 pthread_mutex_init&#xff08;初始…

【2024济南生物发酵展同期会议】合成生物学背景下的发酵深层次技术论坛

2024合成生物学背景下的发酵深层次技术论坛 新技术、新资源、新机遇 反应设备.过滤分离.提取浓缩.干燥.流体机械.实验室设备.仪器仪表.废水废气 主办单位&#xff1a; 生物发酵展组委会 发酵人社区公众号 万物生物合成俱乐部 承办单位&#xff1a; 上海履济技术服务中心 …

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示 引言 在企业级应用或桌面程序中&#xff0c;经常需要从远程服务器获取数据&#xff0c;并在用户界面上展示这些数据。本文将通过一个实际案例&#xff0c;演示如何在 Windows Forms 应用程序中使用 FtpWebReques…