由.o文件生成.a文件(静态库)或者.dll文件(动态库)

用gcc生成静态库动态库 先在终端窗口创建并打开有个文件,以备之后的程序存储所用。在运行之前,需要先将动态库复制到此目录下。在创建函数库前,我们需准备示例的程序。Esc退出到命令模式:wq保存并退出。完成编写后,同样输入:wq保存并退出。同样可以输入ls -l查看是否生成。然后输入./main执行程序,输出。同样也是输入ls -l可以查看。,将文件转换成.o格式文件。同理生成sub.a文件格式。同样编写完后记得保存。连接静态库,其实就是。./main运行程序。 阅读详情

我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

(1) 静态库

简单地说,静态库是一个目标文件的简单集合。因此,首先要解决目标文件。
第一步:将各函数代码所在的源文件编译成目标文件。

例如,对于myfunc.c, myproc.c, 将得到myfunc.o和myproc.o

gcc -c myfunc.c myproc.c

第二步:由ar(archive,归档的意思)把多个目标文件集合起来

$ar -r libmyjob.a myfunc.o myproc.o

通常,静态库的命名方式应遵守libXXXXX.a格式。应用程序在使用静态库的时候,通常只需要把命名中的XXXXX部分传递给gcc即可。例如:

$gcc –o mywork –lmyjob …

意为让gcc(实际上是gcc调用ld)去连接一个名字为libmyjob.a(或者libmyjob.so)的库。如果库的命名不遵循libXXXXX.a的格式就找不到相应文件。

(2) 共享库

共享库的构造复杂一些,通常是一个ELF格式的文件。可以有三种方法生成:

$ld -G
$gcc -shared
$libtool

用ld最复杂,用gcc -share就简单的多,但是-share并非在任何平台都可以使用。GNU提供了一个更好的工具libtool,专门用来在各种平台上生成各种库。

用gcc的-shared参数:

gcc –shared –o libmyjob.so myjob.o

这样,就通过myjob.o生成了共享库文件libmyjob.so.

特别地,在CYGWIN环境下,仍需要输出符合Windows命名的共享库(动态库),即libXXXXX.dll。如:

gcc –shared –o libmyjob.dll myjob.o

注意:
    当静态库和动态库同名时, gcc命令将优先使用动态库。

(3) 库生成以后的配置

如果要把自己开发的库文件安装到操作系统中,需要有管理员权限:
(a) 把库文件复制到适当的目录:
     可以把自己开发的动态连接库放到/usr/local/lib(或者/usr/lib),或放到其他目录,但不论放在那里,都必须与LIBRARY_PATH的值、LD_LIBRARY_PATH的值相一致。
(b) 修改相关的系统配置文件:
     修改/etc/ld.so.conf,然后利用/sbin/ldconfig来完成.

Note:

编译参数解析
     最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l -L.:表示要连接的库在当前目录中
l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
    调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

QT 静态库动态库的使用方法 QT 静态库动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1.cpp -o 1.s 3汇编 将汇编代码编译成二进制代码 g++ -c 1.cpp -o 1.o 4链接 链接我们用到的函数代码 还有地址(包含静态库动态库是在运行时链接) gcc 1.c 静态库... 阅读详情

相关推荐

动态库dll静态库

catalog链接静态库示例缺点动态库(共享库) 链接 链接(linking): 将各种代码和数据 收集起来组合成 一个文件 的过程 链接可以发生在: (编译时: .c -> .o) (加载时: 程序 被加载器loader 加载到 存储器) (运行时: 实际运行时) 我们的源文件my.c 经编译后 产生my.obj文件 ' 但是,我们思考一个问题: 我们的my.c里 写的什么内容??' 1, 我们自定义且实现的函数/数据 void my_func(){ xxx } int my_data =

WChang的博客 3499

cygwin中将一系列.o文件包成.a文件

在cygwin或者linux中,可以通过以下命令,将一系列.o文件包成.a文件。 ar crv libtest.a *.o 或者也可以用如下命令。 ar rc libtest.a *.o 运行结果如下图所示: 由上图结果可知,通过如上命令,可以将一系列.o文件包成.a文件。 参考内容:https://www.cnblogs.com/josht...

净无邪博客 2092

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

03Linux下静态库动态库(共享库)的制作与使用

Linux静态库动态库的制作与使用

AZhi 1232

C/C++库文件全了解(包含静态库动态库,包含windows、linux,包含dll、lib、so)

目录C/C++库文件全了解一. 前言二. 名词解释2.1. windows的静态库:xxx.lib2.2. windows的动态库:xxx.dll2.3. linux的动态库:libxxx.so2.4. linux的静态库:xxx.a三. 自己编译库3.1 编译产生windows的静态库3.1.1代码准备:3.1.2 static_lib.cpp:3.1.3 static_lib.h:3.2 编译...

hsqyc的博客 1万+

Linux的.a、.so和.o文件

我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库动态库两 种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态 库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运 行时还需要动态库存在。本文主要通过举例来说明在Linux中如何创建静态库动态库,以 及使用它们。 在创建函数库前,我们先来准备举例用的源程序,并

chlele0105的专栏 3万+

Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

系统1:ThinkPad T570、Windows10、QT5.12.2(Qt Creater 4.8.2) 1.在qtcreater中按如下步骤创建动态库动态库名为mydll: 选择Library项目,C++库 选择共享库: 选择qt自带的kit: 在工程中自动生成的mydll.pro文件里内容如下: #--------------------------------------------...

weixin_43935474的博客 1万+

理解Linux的.a、.so和.o文件

转载自https://blog.csdn.net/chlele0105/article/details/23691147 在说明Linux的.a、.so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件dll是动态链接库的库文件。 所...

人生如逆旅,我亦是行人 1万+

静态库动态库的区别以及在C/C++中的调用方法

静态库.lib)和动态链接库(.dll)是在Visual Studio(VS)中开发和构建应用程序时使用的两种不同类型的库文件,它们在应用程序开发中有不同的用途和特性。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 5354

windows lib 静态库dll 动态库

本文转载自 http://zziking.github.io/windows/2019/01/22/windows_lib_link_to_dll.html lib 静态库dll 动态库需要有一个链接的过程,将其依赖的外部符号与对应的库链接起来,Visual Studio 中的 link 工具提供了此功能。 在 windows 的命令行下,需要先运行 vcvars64.bat 初始化编译环境,...

kingjxust的专栏 4805

将多个静态库合并为一个静态库(使用安卓NDK编译链)

最近在学习ffmpeg移植到安卓,但是ffmpeg编出来的库有好几个,想着合并成一个看着舒服一点,以此记录 将多个静态库合并为一个静态库 先学习两个命令 静态库好比一个压缩包,使用ar x libxxx.a可将里面的.o文件还原 ar x libxxx.a 使用ar rc libtarget.a a.o b.o c.o xxx.o可将多个.o打包为一个.a ar rc libtarget.a *.o 如果是使用交叉编译的库,需要把ar工具换为交叉编译链接工具里的ar,如下是...

mvp_Dawn的博客 2574

vs2010自动生成文件解析

SDF文件和ipch文件夹:  visual studio 2010 中新建一个项目会同时建立一个ipch目录与sdf文件,即使你删掉它,再次打开工程时还是会重新建立。动辄30、50M的容量让我们心里很不爽。其实这是2010的一个新功能,与智能提示,错误提示,代码恢复、团队本地仓库等等息息相关的东西。如果大家觉得很不爽可以关掉它。Tools —— Options —— Text Editor

yyhero1的专栏 5832

单片机中代码生成.a文件

1、环境:window10。 2、安装gcc工具,在这,我安装了mingw这个工具。 单片机中代码生成.a文件 1、首先要把.c文件生成.o文件 2、然后再把.o文件生成.a文件。 具体操作步骤如下: (1)编译生成.o目标文件,如:gcc -c test.c 注:-c选项表示只编译生成.o目标文件. (2)使用ar命令生成.a库文件,如ar -rv libtest.a test.o 注:ar命令可以用来创建、修改库,也可以从库中提出单个模块。 r:在库中插入模块(替换)...

qq_36075612的博客 8276

包成(.a)文件

header search paths 文件路径 1.生成.o文件 gcc -c 文件名1.c2. ar crs 文件.a 文件名1.o3. gcc main.c -I. -L. -ltest4.查看文件中的符号 nm 查看.a是虚拟机还是真机两种方法 file libStudent.a lipo -info libStudent.a //将几个.a组成一个.alipo -cre...

weixin_34194087的博客 365

ubuntu下初试静态库.a 与共享库.so

ubuntu下初试静态库.a 与共享库.so 实验目的: 欲将a1.c,a2.c生成静态库.a与共享库.so以供test.c使用。 阅读技术基础: 需有gcc、makefile的一些基础,以及熟悉linux基础操作。 1.实验环境 1.ubuntu16.04(安装教程) 2.gcc-5.4.0(安装:apt install gcc ) 3.make-4.1(安装:apt install make ) 2.测试源码 a1.c /*************************************

qq_43938052的博客 320

gcc编译: 打包若干.o和.a文件为新的.a文件

使用场景: gcc编译cpp的时候会生成.o , 然后若干.o文件会打包生成.a文件 但是有的时候是需要

宁静,忍耐,伟大,坚强! 3463

【麒麟桌面系统】企业微信提示当前副设备的企业微信版本较低

银河麒麟系统中登录企业微信时出现"副设备版本较低"的报错,可通过两种方案解决:1)更新最新版企业微信,需替换软件源并刷新软件商店安装8.0-50-4.1.26.6019kylin5版本;2)安装内测5.0版本企业微信,需下载deb包后使用sudo dpkg命令安装。文章还提供了常见问题解决表和长期维护建议,包括系统更新检查、软件源验证等维护项目及具体操作指南。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2095

PC1500程序BASIC源代码

PC1500程序BASIC源代码,程序集几乎包容了水利工程的基本的计算,绝对是水利计算必不可少的利器!

下一篇: 常用的 预定义宏
voidbroken
博客等级 码龄15年 4粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值