当前位置: 首页 > article >正文

记录 | linux静态库和动态库的理解

hello.cpp

#include <cstdio>

void hello() {
    printf("Hello, world!\n");
}

main.cpp

#include <cstdio>

void hello();

int main() {
    hello();
    return 0;
}

静态库编译配置:

cmake_minimum_required(VERSION 3.12)
project(hellocmake LANGUAGES CXX)

add_library(hellolib STATIC hello.cpp)
add_executable(a.out main.cpp)
target_link_libraries(a.out PUBLIC hellolib)

动态库编译配置:

cmake_minimum_required(VERSION 3.12)
project(hellocmake LANGUAGES CXX)

add_library(hellolib SHARED hello.cpp)
add_executable(a.out main.cpp)
target_link_libraries(a.out PUBLIC hellolib)

编译:

cmake -B build

cd build 
make

在这里插入图片描述
反汇编:

objdump -d a.out | less

在这里插入图片描述
可以看到静态库编译是把实现写在了可执行程序里面了,而动态库编译是跳转到了动态库,所以执行的时候,如果是静态库编译,则可以抛开.a;而动态库编译的话,就必须要链接动态库。

所以也是为什么静态库编译的执行程序会比动态库编译的要大的原因了


http://www.kler.cn/a/159763.html

相关文章:

  • 批量重命名Excel文件并排序
  • 软件测试面试大全(含答案+文档)
  • Llama微调测试记录
  • flutter下拉刷新上拉加载的简单实现方式三
  • Spring Boot 中的全局异常处理器
  • 什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性
  • 3.4_1 java自制小工具 - pdf批量转图片
  • 数字化时代的保镖:实人认证API在身份验证中的角色
  • 【Redis】redis 高性能--线程模型以及epoll网络框架
  • 每日一题(LeetCode)----字符串--重复的子字符串
  • photoshop实现抠图的步骤
  • 《golang设计模式》第三部分·行为型模式-09-策略模式(Strategy)
  • Python学习路线 - Python语言基础入门 - 判断语句
  • 【langchain实战】开源项目-RasaGPT
  • 浏览器的favicon.icon 消失不见解决方案
  • 浏览器判断某一个 ip 是否与其在同一个局域网的几种方式
  • S120和PLC通讯设置
  • EDW国际数据管理最新趋势(二)|信息供应链与数据
  • 人类长寿新突破背后:“原知因”成为炙手可热新课题
  • heatmap.js热力图【vue3】
  • 【开题报告】基于SpringBoot的农场管理系统的设计与实现
  • 用OpenCV与MFC写一个图像格式转换及简单处理程序
  • Win11安装Docker
  • 【数据库】数据库多种锁模式,共享锁、排它锁,更新锁,增量锁,死锁消除与性能优化
  • 二叉树链式结构的实现——C语言
  • PG 常用维护性 SQL