通过 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.hqwc.cn/news/346048.html

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

相关文章

Camtasia2024屏幕录像和视频编辑软件

做网络教学视频,开发微课程,用得最多的就是录屏视频编辑,而在这类软件中我只推荐Camtasia Studio。随着Camtasia Studio的更新,其功能越来越完善,用户界面越来越友好,除了安装更加简单,汉化只需…

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…

Linux进阶课:目录(文件夹)与文件操作

1、ls与cat的区别是是什么? 答:ls命令的含义是list,显示当前目录中内容。不加参数时它显示当前目录中除隐藏文件外的所有文件及目录的名字。 cat命令是linux下的一个文本输出命令,通常是用于查看某个文件的内容的。 2、[abc]这个…

Embeddings: What they are and why they matter

embeddings 是什么意思https://simonwillison.net/2023/Oct/23/embeddings/推荐原因:GPT 模型的基础是一种叫做 embeddings 的技术,用来将文本转换成向量,从而可以计算出文本之间的相似度。这篇文章详细地介绍了embeddings及应用 Embeddings…

jmeter请求发送加密参数

最近在做http加密接口,请求头的uid参数及body的请求json参数都经过加密再发送请求,加密方式为:ase256。所以,jmeter发送请求前也需要对uid及json参数进行加密。我这里是让开发写了个加密、解密的jar,jmeter直接调用这个…

【算法分析与设计】最短路径和

题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 示例 1: 输入:grid [[1,3,1],…

缓解大语言模型(LLM)幻觉的可行方法探究(课程综述)

缓解大语言模型(LLM)幻觉的可行方法探究 转载请标明出处,🈲抄袭 摘要:2022年11月OpenAI推出能够进行多场景对话的大语言模型ChatGPT,ChatGPT凭借大规模的训练参数、海量的训练数据及强化学习人类反馈在语…

通过代理连接sftp

通过nginx代理连接sftp 1.问题描述2.代码实现3.nginx配置3.1 创建sftp.stream文件3.2 修改nginx配置 4.重启nginx生效 1.问题描述 问题是这样的。我们现在需要在微服务所在内网的A机器连接到外网的sftp,但是网络又不能直接到达。然后A机器到B机器是通过的&#xff…

java中数组

文章目录 java中数组思维导图数组数组概念 数组定义格式详解数组的访问 常见异常数组索引值越界异常:ArrayIndexOutOfBoundsException空指针异常:NullPointerException 案例例一打印A-Z和0-9例二数组转置输出 java中数组 思维导图 数组 数组概念 组就…

数据分析概述2(详细介绍机器学习

目录 1.名词解释:1.1算法和模型1.2参数和超参数 2.基础算法:3.高级算法:4.数据准备5.常用python包小结: 1.名词解释: 1.1算法和模型 算法:用于训练模型的方法,分为有监督学习、无监督学习、半…

企业网盘:实现数据跨境传输,助力企业出海的必备工具

今年是“一带一路”十周年。在这十年间,中国和“一带一路”共建国家携手并行,贸易持续增长发展。在如今经济全球化的大方向下,跨国经济合作将会是各国共识。 目前,中外合作企业、跨境企业已成为国际贸易发展趋势。不过&#x…

Vant4在Vue3.3中如何按需导入组件和样式

前言 最近我在Vue 3.3的项目中对Vant4做按需导入时,尽管按照Vant4的官方指南进行操作,但样式仍然无法正确加载。经过深入研究和多篇文章的比较,我终于找到了在Vue3中如何正确的按需导入Vant 4组件和样式的方法。由于Vue3.3和Vant4相对较新&am…