Linux下编译静态库和动态库

linux 下编译生成静态库和动态库 我们此处为了说明静态库和动态库的编译,会使用示例代码。创建  test.h, hello.cpp 和 world.cpp, 在两个源文件中分别实现两个函数( 此处都是示例代码,文件命名不规范,理解意思即可 )。test.h (静态库头文件)#ifndef _TEST_ #define _TEST_ void hello(); void world(); #endifhello.cpp:#inclu... 阅读详情
转自:http://www.diybl.com/course/6_system/linux/Linuxjs/20071027/80547.html


每个程序实质上都会链接到一个或者多个的库。比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等。无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dynamic libary)。
链接到静态库会使你的程序臃肿,并且难以升级,但是可能会比较容易部署。
而链接到动态库会使你的程序轻便,并且易于升级,但是会难以部署。


静态库
静态库也就相当于是把一系列的object文件放在同一个文件中(类似windows中的.lib文件)。当你提供一个静态库给链接器时,连接器将会搜索静态库,从中找到他所需要的object文件,提取出他们,将他们链接到你的程序中,就像你直接提供那些文件一样。
如何创建静态库呢?你可以使用ar命令来创建。
下面我们举个例子:
test/lib/test1.c
#include <stdio.h>


int hello_world1()
{
    printf("hello world1\n");
    return 1;
}


test/lib/test2.c
#include <stdio.h>


void hello_world2()
{
    printf(" hello world2\n");
}


test/app.c
#include <stdio.h>


int main()
{
    hello_world1();
}


现在我们编译他们进入目录test/lib
$gcc -c test1.c
$gcc -c test2.c
$ls
test1.c  test1.o  test2.c  test2.o
$ar cr libtest.a test1.o test2.o
$ls
libtest.a  test1.c  test1.o  test2.c  test2.o
cr标志告诉ar将object文件封装(archive),我们可以使用nm -s 命令来查看.a文件的内容
$nm -s libtest.a


Archive index:
hello_world1 in test1.o
hello_world2 in test2.o


test1.o:
00000000 T hello_world1
         U puts


test2.o:
00000000 T hello_world2
         U puts


现在让我们编译主程序
首先退出lib目录
$cd ..
$gcc -o app app.c -Llib -ltest
-L指定了lib的搜索路径,-l指定了链接的库的名字-ltest也就是链接libtest.a
$./app
hello world1
hello_world1()被从libtest.a中找到并链接过来了,于是整个的过程中没有出现问题。


动态库
动 态库(static lib)也可一也可以成为共享库(shared lib),一般的后缀名是.so。动态库与静态库有点类似,他们都是一系列的object文件的集合,只是他们的组织方式不同。同样他们的链接方式也是不 同的,动态库只在执行是链接使用,并不把相应的部分编译入程序中,在使用是一个库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,链接时各 程序使用自己的库。
下面我们来介绍如何创建动态库,还是之前的三个文件,同样的布局,进入lib目录
$gcc -c -fPIC  test1.c
$gcc -c -fPIC  test2.c
-fPIC告诉gcc将源代码编译成共享的object文件,PIC(Position-Independent Code)非位置依赖性代码。
$gcc -shared -fPIC -o libtest.so test1.o test2.o
将两个文件整合为共享库libtest.so
退出lib目录
$cd ..
$gcc -o app app.c -Llib -ltest
$./app
./app: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
啊哈,我们在这里遇到一个error没找到libtest.so,说明我们的编译成功了,libtest.so成为了一个shared libary。程序之所以不能运行是因为libtest.so不在默认的搜索路径上
怎样才能让他跑呢?
$LD_LIBRARY_PATH=$PWD/lib ./app
hello world1
我们在自己指定链接的路径,他找到了我们的libtest.so文件,并且链接成功了。


参考资料:
    《Advenced linux Programming》Mark Mitchell, Jeffrey Oldham,and Alex Samuel
    man nm
    man ar
【Linux】Linux下的gcc编译以及静态库和动态库的制作以及make的使用 一、前言 系统开发人员为了提高项目开发的效率,往往使用成熟库。如何制作静态库和动态库,是软件工程师的基本技能。通过库文件,开发人员可以将自己经常使用的函数封装到库文件中,一方面提供代码的重用,另一方面避免重复劳动,提高项目开发的速度。每一位系统研发工程师,都要学会制作和灵活使用静态库和动态库。 其实就是在Linux里运行c语言,用gcc编译器编译c语言,所谓的库也就是我们之前学c/c++面向对象程序设计时 写的头文件。 二、gcc编译器 1、gcc编译器工作过程: 2、gcc编译器编译过程: 3、gcc 阅读详情

相关推荐

OpenLayers源码解析1 Map.js

Map.js 父类:./PluggableMap/PluggableMap 引用:5个模块 ./renderer/Composite.js ./PluggableMap.js ./obj.js ./control.js(控件) ./interaction.js(交互) 主要功能:核心组件,渲染地图 必要参数: view layers target controls和interactions要是未指定,使用默认值 方法:createRenderer()? /** * @module ol/Map */ i

qq_45005996的博客 1898

linux动态库与静态库的编译与加载

http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/ Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-fPIC,-shared;

cjsycyl的专栏 4169

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6032

linux下的静态库和动态库的编译

每个程序实质上都会链接到一个或者多个的库。比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等。无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dynamic libary)。链接到静态库会使你的程序臃肿,并且难以升级,但是可能会比较容易部署。而链接到动态库会使你的程序轻便,并且易于升级,但是会难以部署。静态库静态库也就相当于是把一系列的objec

SecularBird的专栏 2544

USB通讯速度翻倍秘诀:手把手教你用WinUsb替代HID协议(附Zadig驱动配置图解)

本文详细介绍了如何通过WinUsb技术替代传统HID协议,实现USB通讯速度的显著提升。从技术对比、实现原理到Zadig驱动配置图解,手把手教你完成免驱高速通讯方案,适用于数据采集、固件升级等场景,实测速度可达HID协议的2倍以上。

weixin_29168675的博客 133

YOLOv12涨点改进| Kimi团队 2026 |独家创新首发、注意力改进篇|爆火AttnRes残差自注意力模块,含多种创新改进,借助残差思想,缓解细节信息在传播过程中被稀释,促进YOLOv12涨点

🔥本文提出AttnRes残差自注意力模块改进YOLOv12模型,通过深度维度的注意力加权机制替代传统固定残差累加方式。该模块能自适应选择更有价值的历史层特征进行聚合,缓解浅层信息在深层传播中被稀释的问题,提升小目标和复杂场景的检测能力。文章详细介绍了模块结构、原理及优势,并提供了完整的代码实现和配置方法,包括三种改进方案:yolov12n_AttnRes.yaml、yolov12n_AttnRes-2.yaml和yolov12n_A2C2f_AttnRes2D.yaml。

Ai缝合怪、助力小伙伴高效发论文 183

linux运行时找不到动态库,解决Linux系统下程序找不到动态库的方法

思路:一般来说,通过make命令已经将程序依赖的动态库编译出来了,通过make install命令已经将动态库安装到系统的某个路径下。找没找到动态库就看这个路径是否包含在系统默认搜索动态库的路径中,如果不在,那么就会提示找不到动态库。以下三种方法,就是根据前面的分析来解决的。方法一:修改LD_LIBRARY_PATH环境变量特点:这种方法主要处理临时的动态库加载,LD_LIBRARY_PATH环境...

weixin_29252171的博客 4750

代谢组数据分析(三十一):空间代谢组学分析从数据加载到通路分析的流程解析

空间代谢组学是一种先进的技术,能够在组织切片上以高分辨率检测代谢物分布,为理解生物代谢过程提供新视角。其分析流程包括数据获取、预处理、代谢物注释、差异表达分析、可视化、通路分析、聚类分析及空间相关代谢物分析等关键步骤。这些步骤帮助研究人员从海量数据中提取有价值信息,揭示代谢物的空间分布规律,发现潜在生物标志物,探索代谢通路调控机制。例如,SpaMTP等工具为全流程分析提供了强大支持,助力研究人员高效处理数据,深入理解代谢过程,为生物学研究和临床应用提供重要依据。

专注生信领域 918

linux中静态库和动态库的区别和编译

linux中静态库和动态库的区别和编译  Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a  为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。  ln -s li

Jack Zhu 1535

Unreal5 从入门到精通之 学习Niagara特效系统

UE5 Niagara粒子系统解析 Niagara是UE5中的高性能粒子特效系统,相比传统粒子系统具有完全可编程性和可视化节点编辑两大特点。核心单元发射器(Emitter)分为模板发射器(预设效果如喷泉、火焰)和空白发射器(高度自定义)。系统提供13种预设模板,包括吹飞粒子、五彩纸屑爆发、动态光束等常见特效。 Niagara采用三级模块化设计: 系统级:全局参数设置与更新 发射器级:控制粒子生成规则与行为 粒子级:处理单个粒子的生命周期和渲染 关键模块包括初始化粒子属性、物理模拟、颜色渐变等,支持GPU加速

TxNet 1122

10、基于单倍型多样性隐马尔可夫模型的基因型错误检测

本文提出了一种基于单倍型多样性隐马尔可夫模型(HMM)的基因型错误检测方法,旨在提升三人组基因型数据中错误识别的准确性。通过利用群体水平的连锁信息,该方法克服了传统方法在小系谱数据中表现不佳的局限性。文章详细介绍了模型结构、三种替代似然函数及其计算方法,并通过模拟数据集和真实数据集验证了方法的有效性。实验结果显示,该方法在灵敏度、特异度和准确率方面均表现出色,为基因数据质量控制提供了新的解决方案。

moon9的博客 96

linux下 jansson gcc编译及交叉编译

一、编译安装包版本 jansson-2.11.zip 二gcc编译 1)安装autoreconf apt-get install autoconf / yum -y install autoconf 2)安装LIBTOOL apt-get install libtool / yum -y install libtool 3)解压,进入解压目录 unzip jansson-2.11.zip ...

qq_40565735的博客 1389

大模型——Coze工作流实战:一键生成像素风格视频

本文介绍了如何利用Coze平台工作流生成像素风格心理学短视频的方法。通过创建工作流、设置变量节点、调用大模型生成文案、数据格式化处理、合成音频、生成字幕等步骤,最终实现从输入主题到生成完整视频的自动化流程。文章详细展示了每个节点的具体配置方法,包括提示词编写和数据处理脚本,为读者提供了完整的像素风格视频制作解决方案。

817

linux如何编译静态库,linux静态库和动态库编译及使用

/**************************************************************************//*add.c*/int add(int x, int y){return x + y;return 0;}/*********************************************************************...

weixin_31366459的博客 1347

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux下的静态库和动态库以及gcc常见编译选项

一、linux下的静态库和动态库 linux和windows下都有大量的库,库在本质上就是可执行的二进制代码,可以被操作系统载入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要必须得遵守许可协议。 1.静态库 静态库的文件命名方式是“libxxx.a",库名前加"lib",windows和linux下都是用后缀”.a",“xxx"为静态...

心.跳的博客 1479

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux-C动态库与静态库的编译与调用

Linux-C动态库与静态库的编译与调用 一、简述 记录-Linux-C动态库与静态库的编译与调用。将实现某部分功能的代码封装成库文件,以方便调用,或者是对代码进行保护加密。应用场景:有时想将某代码提供给别人用,但是又不想公开源代码,这时可以将代码封装成库文件。在开发中调用其他人员编写的库。 动态库特点: 1,库的代码不会编译进程序里面,所以动...

Genven_Liang的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux编译动态库 静态库

Linux 编译生成库文件的命令将 share.c 编译生成一个动态库: gcc share.c -o libshared.so -shared -fPIC 将 static.c 编译生成一个静态库: 方式一: gcc -o static.o -c static.c ar -r libstatic.a static.o 方式二: gcc -o static.o -c static.c -shared -f...

a3121772305的博客 2049

Linux下g++编译与使用静态库和动态库

在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的。刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐。下面就分别总结下linux下生成并使用静态库与动态库的方法

Sean.W的专栏 3万+

linux下dlib静态库和动态库编译

本文讲述的linux系统下如何编译dlib的静态库和动态库方法。

漫步者 1052

linux 编译mqtt静态库_静态库和动态库详解及使用方法

使用和生成库基本概念库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。ln -s libhello.so.1.0 libhello.so.1ln...

weixin_39542608的博客 731

linux openssl 编译静态库,OpenSSL Linux动态库编译

OpenSSL Linux动态库编译发布时间:2020-03-15 16:30:08来源:51CTO阅读:1077作者:fengyuzaitu静态库编译./configmakemake install动态库编译./config sharedmakemake install问题1)relocation R_AARCH64_ADR_PREL_PG_HI21之前编译完成静态库,没有清理干净,出现问题指令...

weixin_35816790的博客 1121

linux下编程动态库和静态库编译使用

我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 linux下编程动态库文件为.so文件,静态库文件为.a文件 本文主要通过举例来说明在Linux中

ywy463726588的专栏 973

linux编译动态库和静态库

任务场景:将cpp文件编写成动态库,在arm32上调用并输出char型数组。

weixin_42195999的博客 384

Linux 中的动态库与静态库:编译、使用与最佳实践

在 Linux 中,库文件是程序运行的重要组成部分。动态库(Shared Library):以.so结尾,运行时加载,多个程序共享。静态库(Static Library):以.a结尾,编译时嵌入程序,运行时不依赖外部库。动态库和静态库各有优缺点,选择时需要根据具体需求权衡。动态库适合大型系统和需要频繁更新的场景,而静态库适合独立运行的工具和嵌入式系统。在开发过程中,合理使用工具(如lddnmobjdump)可以帮助更好地管理和调试库文件。

Ly001_的博客 1187
上一篇: qt-embedded 参数配置介绍
下一篇: rhel-server-5.4设置nfs服务器以及错误纠正
ckangle
博客等级 码龄14年 48粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值