C语言—Linux环境下CMake设置库(动态/静态)

1. Yesterday Once More

由于昨日我们在VSCode设置了如何使用CMake构建与编译c语言项目,如有疑问,请看以下链接,今日根据昨天的配置来进一步完成项目的构建。

c语言- 如何构建CMake项目(Linux/VSCode)-CSDN博客

2. 动态静态lib的区别

1. 静态库与动态库对比表

特性静态库(.a / .lib)动态库(.so / .dll)
文件扩展名Linux: .a
Windows: .lib
Linux: .so
Windows: .dll
链接时机编译时完整链接到可执行文件运行时动态加载
可执行文件体积较大(库代码被复制到可执行文件中)较小(仅记录库的引用)
运行时依赖无需依赖库文件必须存在对应的动态库文件
内存占用每个程序独立占用库的内存多个程序共享同一份库的内存
更新维护需重新编译程序替换库文件即可生效
兼容性与编译时的库版本完全绑定需保证接口兼容性(版本管理重要)
性能略快(无运行时加载开销)略慢(首次加载需额外时间)
跨平台支持依赖编译平台需为不同平台编译对应的动态库
典型应用场景小型项目、嵌入式系统(无动态加载环境)大型项目、插件系统、多程序共享库

2. 核心区别详解

1. 链接方式与内存管理
  • 静态库

    • 在编译时,库的代码会被完整地复制(copy)到最终的可执行文件中。

    • 优点:程序独立运行,无需外部依赖。

    • 缺点:可执行文件体积大,多进程运行时内存占用高(库代码被多次加载)。

  • 动态库

    • 编译时仅记录库的符号(函数名、变量名等),运行时由操作系统动态加载。

    • 优点:节省磁盘和内存空间,支持热更新(替换库文件无需重新编译程序)。

    • 缺点:部署时需确保目标系统存在正确的库版本。

2. 更新与维护
  • 静态库
    修改库代码后,必须重新编译链接程序才能生效。

    # 重新编译静态库和程序

  • gcc -c Exampile.c -o Exampile.o
    ar rcs libExampile.a Exampile.o
    gcc main.c -L. -lExampile -o main

    动态库

  • 更新库文件后,只需替换旧库文件,所有依赖该库的程序会自动使用新版本(需接口兼容)。

  • # 编译动态库
    gcc -shared -fPIC Exampile.c -o libExampile.so
  • # 编译程序时链接动态库
    
    gcc main.c -L. -lExampile -o main

    3. 跨平台与兼容性

  • 静态库
    不同操作系统(如 Linux 和 Windows)需分别编译静态库,且格式不兼容。

  • 动态库
    需为每个平台编译对应的动态库(如 Linux 的 .so 和 Windows 的 .dll),且需注意符号版本控制(如使用 soname)。

1

1

1

3. 在linux环境下设置库与编译文件

主要是更改CMakeLists.txt文件,分五部分

1. 更改source,指定路径下的文件

# 2.需要的依赖库 现在没有
set(SOURCESsrc/foo.csrc/bar.csrc/you.c
)

2. 用获取到的路径变量,创建动/静库

# 创建静态库 source获取路径
add_library(mylib_static STATIC ${SOURCES})# 创建动态库,source获取路径
add_library(mylib_shared SHARED ${SOURCES})

3. 对动态库设置rpath

set_target_properties(mylib_shared PROPERTIES# 插入路径为INSTALL_RPATH "\$ORIGIN"BUILD_WITH_INSTALL_RPATH TRUE
)

4.  连接动/静库(此时为动态库)

# 链接共享库
target_link_libraries(main mylib_shared)

5. 把之前扫描src下的c文件注释掉

# 扫描src目录下的所有C文件
# aux_source_directory(src SRC_FILES)
# add_executable(main ${SRC_FILES})

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.10.0) # CMake版本
project(t1 VERSION 0.1.0 LANGUAGES C) # 项目版本# debug模式
SET(CMAKE_BUILD_TYPE Debug) # debug模式# SET(CMAKE_BUILD_TYPE Release) #Release严格测试模式# 暂时不管,测试
include(CTest)
enable_testing()# 2.需要的依赖库 现在没有
set(SOURCESsrc/foo.csrc/bar.csrc/you.c
)# 3.设置可执行文件与链接库保存的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 4.设置头文件目录使得系统可以找到对应的头文件
include_directories(${PROJECT_SOURCE_DIR}/inc/inner # 自己目录的头文件${EIGEN3_INCLUDE_DIR} # 其他系统目录的头文件 也可以直接写路径/usr/include/eigen3${Pangolin_INCLUDE_DIRS}
)# 5.编译动态库并链接库文件
# 创建静态库 source获取路径
add_library(mylib_static STATIC ${SOURCES})# 创建动态库,source获取路径
add_library(mylib_shared SHARED ${SOURCES})# 设置rpath仅对共享库生效
set_target_properties(mylib_shared PROPERTIES# 插入路径为INSTALL_RPATH "\$ORIGIN"BUILD_WITH_INSTALL_RPATH TRUE
)# 6.生成可执行文件
# 选择需要编译的源文件,有几个文件写几个
add_executable(main src/main.c)# add_executable(my src/main.c src/test.c)
# 扫描src目录下的所有C文件
# aux_source_directory(src SRC_FILES)
# add_executable(main ${SRC_FILES})# 链接共享库
target_link_libraries(main mylib_shared)# 链接静态库
# target_link_libraries(main mylib_static)# 配置cmake项目名称
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})# 配置cmake项目c语言的版本 11
set(CMAKE_C_STANDARD 11)# 设置交叉编译器的位置
set(CMAKE_C_COMPILER gcc)
include(CPack)

点击ctrl+shift+b编译后,执行bin下的mian二进制文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MC】红石比较器

在《我的世界》(Minecraft)中,红石比较器(Redstone Comparator) 是一种高级红石元件,主要用于 检测、比较或处理信号强度,同时还能与容器、特定方块互动。 红石比较器有两种模式: 比…

AI应用电商篇汇总(持续补充)

数据集: 1、天池大数据众智平台-阿里云天池 2、魔搭社区 3、https://huggingface.co/datasets 应用: 1、从电商角度设计大模型的 Prompt-CSDN博客 2、常见的LLM-CSDN博客 3、LLM模型的常见部署方式-CSDN博客 4、ollamaopen-webui搭建可视化大模型…

使用Jenkins部署nodejs前端项目

1. 安装node环境 1.1 下载 https://nodejs.org/zh-cn/download 1.2 解压到安装目录 tar -xJvf node-v22.15.1-linux-x64.tar.xz mv node-v22.15.1-linux-x64 /home/soft/ mv node-v22.15.1-linux-x64/ node22原本计划安装 node22和node18,但是CentOS7.9 GLIBCXX …

Power Integrations 汽车电源管理方案:为汽车应用增加系统价值

在新能源汽车产业蓬勃发展的当下,高效的电源管理方案成为提升汽车性能与可靠性的关键。近期,Power Integrations 举办线上交流会,介绍了基于其 1700V InnoSwitch3-AQ 反激式开关 IC 的五款全新参考设计,旨在为 800V 纯电动汽车提供…

前端mjs和js文件区别,mjs和cjs区别---.es.js和.mjs的区别

https://www.cnblogs.com/jocongmin/p/18432236 同一份配置如下,一般打包出来的结果时是一样的,只不过扩展名不一样 export default defineConfig({build: {rollupOptions: {output: [// 同一份配置,仅扩展名不同{ format: es, entryFileNames: [name].mjs },{ fo…

一文掌握vue3基础,适合自学入门案例丰富

Vue3 本文从Vue3的基础语法出发,全面系统的介绍了Vue3的核心概念与应用,旨在帮助自学者更轻松地掌握Vue3。文章内容由浅入深,从通过CDN引入Vue3开始,逐步介绍了组合式API、模块化开发、以及常见的Vue3指令和功能并从单个html的使…

如何自学FPGA设计?

众所周知,FPGA设计自学难度不小,更不存在速成的捷径。这里简单说一下学习的规划,希望能给入门者提供一些方向。 学会相应的知识 不论是科班毕业还是理工科专业出身,想要入行FPGA开发,基础知识必须扎实。尤其是在高校…

Python爬虫(30)Python爬虫高阶:Selenium+Scrapy+Playwright融合架构,攻克动态页面与高反爬场景

目录 一、背景:动态页面与反爬技术的崛起二、技术融合架构设计1. 核心组件分工2. 架构图示3. 关键技术点 三、代码实现:分步详解1. 环境配置2. 核心代码结构3. Scrapy项目集成4. Playwright增强功能示例 四、总结:技术融合的优势与挑战1. 优势…

STM32之定时器

一、内核嘀嗒定时器的原理与应用 基本概念 定时器是STM32中常用的外设,一般定时器的基本功能就是定时,而在Cortex M3/M4内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Systick),它是属于CM4内核的一个外设,内嵌在…

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程 在开发 Android 应用程序时,我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而,有些开发者可能会想要在同一个项目中同时使用这两种语言,这就是所谓的混合编…

云原生安全:错误策略S3存储桶ACL设置为Everyone:FullControl

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——从基础到实践的深度解析 1. 基础概念 S3存储桶与ACL Amazon S3(Simple Storage Service)是AWS提供的对象存储服务,支持存储和检索任意规模的数据。ACL(访问控制列表…

20. 自动化测试框架开发之Excel配置文件的IO开发

20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本(支持xlsx格式&#…