gcc生成动态库静态库

gcc 编译静态链接库 静态链接库(static library)是目标文件(.o文件或.obj文件)的集合,后缀为.a 在编译使用时,静态库会被拷贝到可执行文件中,所以最终生成的可执行文件不依赖于静态库。但这也使得可执行文件庞大,加载速度慢的问题。另外,一旦修改,就必须重新编译,不能想共享库那样灵活的升级。 本文对gcc编辑静态链接库演示一个示例,供参考,好记星不如烂笔头。 1. 编写代码 编写he 阅读详情
gcc生成静态库和动态库

一、库文件简介

简单地说,库(Library)就是一组已经写好了的函数和变量、经过编译代 码,是为了能够提高开发效率和运行效率而设计的。库分为静态库(Static Library)和共享库(Shared library)两类。静态库文件的扩展名是.a,共享库文件的扩展名是.so(在CYGWIN环境下,分别叫做.o和.dll)。共享库现在常常被叫做 动态库,是由于很多人借用了MS Windows的DLL(Dynamic Linked Library)这个词。
(1)静态库
     静态是指每个用到该库的应用程序都拥有一份自己的库拷贝;应用程序运行的时候,即使将库删除也没有问题,因为应用程序自己已经有了自己的拷贝。
(2) 共享库
     一个共享库有可能被多个所有应用程序共享。因此,对每个应用程序来说,即使不再使用某个共享库,也不应将其删除。此外,应用程序需要正确的环境变量设置 (LD_LIBRARY_PATH),从而找到共享库所在的位置,否则,应用程序运行时会报告找不到这个库。

二、关于使用库的问题

     如果库是已经编译好的,那么如何在开发、运行应用程序时使用呢?头文件和库文件所在的路径,必须通过适当的方式通知给编译器、链接器和相关的应用程序。
     对于静态库来说,主要涉及开发工具,如gcc。例如,用gcc编译、链接时,需要通过适当的路径找到头文件和静态库文件;实现的方法有两种:
gcc 的命令行参数(-I, -L)
shell的环境变量(C_INCLUDE_PATH, LIBRARY_PATH
     对于共享库来说,程序在运行时,如果用到了动态库,也需要找到对应的动态库文件;实现的方法:
shell的环境变量 (LD_LIBRARY_PATH)
1) gcc命令行参数(-I, -L)
     默认情况下,gcc会自动搜索下面的路径:
对 头文件:
/usr/local/include/
/usr/include/
对库文件:
/usr/local/lib/
/usr/lib/
     但是由于系统管理员对系统安装路径有不同的配置,或者对于如64位系统等情况,上述路径对于一台具体的计算机来说可能不同。如果开发者还有自己工程所需的 头文件和库文件,就要用gcc的-I和-L来指定对应的路径。如果需要链接库,还要用-l选项。
     例如:如果工程涉及到GDBM(GNU DataBase Management)包,需要libgdbm库,而系统中安装GDBM的路径是:
头文件:/opt/gdbm-1.8.3 /include
库文件:/opt/gdbm-1.8.3/lib/
     那么,gcc的命令参数是:
$gcc … -I/opt/gdbm-1.8.3/include -L/opt/gdbm-1.8.3/lib –lgdbm
     注意:为保证兼容性,必须坚决杜绝在C/C++源文件的#include语句中或者其他相关语句中使用上述路径。
2) shell环境变量(Environmental Variable)
     除了用命令行参数,还可以用环境变量来指示gcc搜索适当的路径。而由于Shell的不同,环境变量的设置方法也不同。常用的Shell有Bash, Csh和Tcsh。
(1)Bash
     对于Bash来说,除了由系统管理员配置的内容以外,每个用户的用户目录($HOME)下,有个.bash_profile文件。可在该文件内,增加下面 的两个语句来设置GDBM头文件路径的环境变量:
C_INCLUDE_PATH=/opt/gdbm-1.8.3/include
export C_INCLUDE_PATH
     类似地,在该文件内用下面的两个语句来设置库文件路径的环境变量:
LIBRARY_PATH=/opt/gdbm-1.8.3/lib
export LIBRARY_PATH
     在.bash_profile中有了上述语句以后,就不用再使用-I和-L来搜索特定包的路径了。但是链接库的时候,还是要用-l选项。
$gcc … –lgdbm
     在Bash下,要检查有什么样的环境变量,可用env命令。
$env
(2)Csh和Tcsh
     如果是Csh或Tcsh,对环境变量的设置方法就不同了。在用户的($HOME)目录下,相关的一些文件如下:
.cshrc 每次进入Csh时的启动(Startup)文件
.tcshrc 每次进入Tcsh时的启动(Startup)文件(在Tcsh下,如果没有这个文件,系统会用.cshrc文件代替)
.login 每次登录Shell时的启动(Startup)文件
     在Csh和Tcsh下,分为Shell变量和环境变量;前者是用来设置Shell本身的,而后者则是供其他程序使用的。一般习惯是:Shell变量 在.cshrc中定义,而环境变量则在.login文件中定义。
     定义Shell变量的方法是在.cshrc或.tcshrc中用set语句:
set history = 20
     定义环境变量的方法是在.login文件中用setenv语句。对于上面关于GDBM的例子:
setenv C_INCLUDE_PATH /opt/gdbm-1.8.3/include
setenv LIBRARY_PATH /opt/gdbm-1.8.3/lib
     在Csh和Tcsh下,可以用setenv命令来查看设置了哪些环境变量(如果要看Shell变量,要用set命令)。
注意:
- 设置Shell变量时要用“=”号;
- 设置环境变量时,变量名与实际值(这里是真实路径)之间没有“=”号;
- 不需要export。
3) 使用共享库
     使用共享库的应用程序,要通过环境变量LD_LIBRARY_PATH找到对应的共享库文件。与其他环境变量一样,对LD_LIBRARY_PATH也要 根据shell的种类和库文件的实际路径进行设置。但是,必须注意的是,与一般的环境变量不同,LD_LIBRARY_PATH的值,是已经安装了的所有 共享库的路径,因此,在Bash下,不能简单地用下面的办法:
LD_LIBRARY_PATH=/opt/gdbm-1.8.3/lib 错误!
export LD_LIBRARY_PATH
     而必须用:
LD_LIBRARY_PATH=/opt/gdbm-1.8.3/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

ldd XX 测试是否动态连接

     这样,就把其他共享库的路径也一起加入进来了。同样地,在Csh和Tcsh下,
setenv LD_LIBRARY_PATH /opt/gdbm-1.8.3/lib:$LD_LIBRARY_PATH

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

(1) 静 态库  
     简单地说,静态库是一个目标文件的简单集合。因此,首先要解决目标文件。
     第一步:将各函数代码所在的源文件编译成目录文件。
     例如,对于myfunc.c, myproc.c
gcc -c myfunc.c myproc.c
将得到myfunc.o和myproc.o。
     第二步:由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的格式就找不到相应文件。
例子:创建静态库
   hello.h为该函数库的头文件。hello.c是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"

hello XXX!"。main.c为测试库文件的主程序,在主程序中调用了公用函数hello。

  1. 程序1:  
  2. //hello.h   
  3. #ifndef HELLO_H   
  4. #define HELLO_H   
  5. void hello(const char *name);  
  6. #endif   
  7. 程 序2:  
  8. //hello.c   
  9. #include <stdio.h>   
  10. void hello(const char *name)  
  11. {  
  12.   printf("hello %s! /n",name);  
  13. }  
  14. 程序3:  
  15. //main.c   
  16. #include "hello.h"   
  17. int main()  
  18. {  
  19.   hello("everyone");  
  20.   return 0;  
  21. }  
程序1:
//hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
程 序2:
//hello.c
#include <stdio.h>
void hello(const char *name)
{
  printf("hello %s! /n",name);
}
程序3:
//main.c
#include "hello.h"
int main()
{
  hello("everyone");
  return 0;
}

实 现步骤:
    第一步:必须将源程序hello.c通过gcc先编译成.o文件,生成hello.o(静态库/动态库,都是由.o文件创建的);
    第二步:由.o文件创建静态库,生成libmyhello.a(静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a)创建静态库用 ar命令;
    第三步:在程序中使用静态库;(只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库 名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文 件)
    第四步:删除静态库文件,程序照常运行,静态库中的公用函数hello已经连接到目标文件main中了。
运行:
[root@localhost moduletest]# ls
hello.c  hello.h  main.c 
[root@localhost moduletest]# gcc -c hello.c
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main.c
[root@localhost moduletest]# ar crv libmyhello.a hello.o
a - hello.o
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.a  main.c
[root@localhost moduletest]# gcc main.c libmyhello.a -o main 
[root@localhost moduletest]# ./main 
hello everyone! 
[root@localhost moduletest]# rm -f libmyhello.a 
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main  main.c
[root@localhost moduletest]# ./main 
hello everyone! 
[root@localhost moduletest]# 

(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

例子:创建动态库(延用上面的程序1,2,3)
实现步骤:
    第五步:由.o文件创建动态库文件(命令:gcc -shared -fPCI -o libmyhello.so hello.o);
    第六步:在程序中使用动态库;(在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc命令生成目标文件时指明动态库名进行编译。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否 则将提示错误信息而终止程序运行。要将文件libmyhello.so复制到目录/usr/lib中)
运行:
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main.c
[root@localhost moduletest]# gcc -shared -fPIC -o libmyhello.so hello.o
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.so  main.c
[root@localhost moduletest]# gcc main.c libmyhello.so -o main
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.so  main  main.c
[root@localhost moduletest]# ./main
./main: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
[root@localhost moduletest]# mv libmyhello.so /usr/lib
可以:
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main  main.c
[root@localhost moduletest]# ./main
hello everyone! 
[root@localhost moduletest]# 
或者:
[root@localhost moduletest]# rm -f main
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main.c
[root@localhost moduletest]# gcc -Wall -g main.c -lmyhello -o main
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main  main.c
[root@localhost moduletest]# ./main 
hello everyone! 
[root@localhost moduletest]#
注意: 
    当静态库和动态库同名时, 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文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

gcc生成静态库、动态库及使用 目录 一 gcc生产静态库与动态库 1.创建文件 2.编译文件 3 由.o文件创建静态库 4.使用静态库 5.创建动态库 6.调用动态库 7.静态库与动态库的优先权 8.补充说明 9.静态库.a 文件的生成与使用 (1)创建文件A1.c 、 A2.c、 A.h、test.c (2)生成目标文件(xxx.o) (3)生成静态库文件.a (4)使用.a文件 10.共享库.so文件的生成和使用 (1)生成目标文件(xxx.o) (2)生成共享库.so文件 (3... 阅读详情

相关推荐

Linux - 如何使用gcc命令生成静态库和动态库

Linux下查看是否有静态库:ar  -tv  test.a   一、库的简述 简单的说,库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率和运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 静态库: 静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,因此利用静态库生成的文件比较大。这类库

YANG 3984

gcc生成静态库和动态库(转自http://blog.csdn.net/ast_224/archive/2009/03/13/3988244.aspx)...

gcc生成静态库和动态库因为看到比较有用,以后可以常要用到,所以就顺手牵羊粘贴过来了。一、库文件简介简 单地说,库(Library)就是一组已经写好了的函数和变量、经过编译代码,是为了能够提高开发效率和运行效率而设计的。库分为静态库(Static Library)和共享库(Shared library)两类。静态库文件...

weixin_30919235的博客 206

gcc生成动态库和静态库

一、用gcc生成静态库和动态库 (1)静态库 静态是指每个用到该库的应用程序都拥有一份自己的库拷贝; (2) 共享库 一个共享库有可能被多个所有应用程序共享。 1.编辑生成例子程序 hello.h、hello.c 和 main.c。 先创建一个作业目录,保存本次练习的文件。 #mkdir test1 #cd test1 然后用 vim、nano 或 gedit 等文本编辑器编辑生成所需要的 3 个文件。 hello.c(见程序 2)是函数库的源程序,其中包含公用函数 hello,该函数将在屏幕上输出"Hel

m0_61878156的博客 2368

用Gcc制作Library

Library 可分成三种, static 、 shared 与 dynamically loaded 。1. Static librariesStatic 链接库用于静态链接,简单讲是把一堆 object 檔用 ar(archiver) 包装集合起来,文件名以 `.a 结尾。优点是执行效能通常会比后两者快,而且因为是静态链接,所以不易发生执行时找不到 library 或版本错置而无法执

autumnqin的专栏 3906

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

Jlink除了调试还能干啥?用JFlash SPI给W25Q64烧录固件的5个实用技巧

本文深入探讨了Jlink的隐藏功能,特别是通过JFlash SPI高效烧录W25Q64的5个进阶技巧。从硬件连接优化到批量处理脚本,再到数据安全验证,这些技巧能显著提升烧录速度和稳定性,适用于量产环境。文章还提供了详细的参数配置和脚本示例,帮助工程师充分发挥Jlink的潜力。

weixin_29164843的博客 409

GCC生成静态库和动态库

 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 一、库文件简介简单地说,库(Library)就是一组已经写好了的函数和变量、经过编译代码,是为了能够提高开发效率和运行效率而设计的。库分为静态库(

hfw_1987的专栏 1038

更多 LSTM 变种——应用于 CMAPSS 数据集

本文并模型介绍,只是把一些比较火的技术,像双向注意力机制,自注意力机制这样的比较火的内容,简单的和LSTM堆叠,结果发现效果都不如最基础的,这里作者将本人代码及实现结果,进行展示,给各位想更改LSTM的朋友一些。

2301_77491330的博客 1765

关于Windows平台上vscode利用GCC链接第三方库的过程记录

过程记录 最近因为测试需要,我在Windows 10操作系统上利用GCC生成并安装libevent的库。我的libevent库的安装路径是D:\Softs\Develop\libevent,目录下包括bin、include、lib三个目录。然后我用Visual Studio 2019建了一个C项目,并配置好了libevent库。写代码进行测试,一切正常。Visual Studio 2019的相关配置如: 项目右键 >> 属性 >> VC++目录 这一部分主要配置包含目录、库目录两

万里无云的博客 3140

deepin搭建samba服务器

一.为什么要用Samba? Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享。二.需要的软件? 我是在deepin上实现的,在终端中使用一下两句命令,就可以安装Samba的软件包 $sudo apt-get install samba //安装samba 三.Samba服务的组成 Samba的核心是两个守护进程smbd和nmbd。当然,它

xbrother123的博客 8598

别再只抄代码了!深入理解MQ2传感器数据手册,搞定ppm换算公式

本文深入解析MQ2烟雾传感器的工作原理与ppm换算公式,从数据手册解读到数学建模,提供详细的校准与优化方法。通过实际案例和代码示例,帮助开发者准确测量气体浓度,解决常见问题,提升传感器应用的可靠性。

weixin_42713608的博客 504

gcc生成静态库和动态库

用gcc生成.a静态库和.so动态库一、库1. 静态链接库2. 动态链接库3.二者差异二、 gcc生成动态库和静态库1. 用前准备2. 生成静态库3. 生成动态库4. 静动态库的优先调用三、Linux下静态库和动态库的生成和使用1. 用前准备2. 静态库.a文件的生成和使用3. 共享库.so文件的生成和使用四、实例使用静动态库1. 用前准备2. 静态库的使用3. 动态库的使用4. 静动态库生成文件大小的比较小小的总结参考文献 一、库 库分为静态链接和库动态链接库,作用相似但又有不同。 1. 静态链接库 静

YouthBlood9的博客 661

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 652

用GCC生成静态库和动态库

静态库和动态库的学习

小伙子的博客 408

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

【72】【OpenCV C++ & C#】 将cv::Mat 图像转换成imgINFO 传给c#在winform上显示,OpenCV C++如何将处理后的图像传给C#呢? 如何获取图像信息呢?

本文介绍了通过OpenCV C++处理图像后传递给C#的方法。首先定义了一个结构体imgINFO存储图像信息(数据指针、宽高、通道数等),然后通过getImgInfo函数将cv::Mat转换为该结构体。文章特别指出当图像宽度不能被4整除时可能出现失真问题,并给出了两种解决方案:调整输入图像或创建新的对齐图像。此外还解释了img.step和img.cols*img.elemSize()的关系,说明它们在大多数情况下是相等的。最后提到需要通过DLL将结构体传递给C#(具体方法参见其他文章)。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 697

用gcc生成静态库和动态库

gcc生成静态库和动态库gcc生成静态态库gcc生成动态库三级目录 gcc生成静态态库 gcc生成动态库 三级目录

手可摘星辰博客 1638

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

在GCC中生成静态库和动态库

在这次的实验中,我初步熟悉了静态库的特性和动态库的特性,静态库主要可以封装原来的.o文件,让其变得便于移植,但是浪费了空间,而动态库并不会直接将代码放入文件中,而是程序运行时才使用,可以进行增量更新。

qq_71979946的博客 262

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

gcc静态库和动态库的生成与使用

如何生成静态库.a文件和动态库.os文件,函数调用静态库和动态库的方法。如何生成目标文件,生成可执行的程序。

qq_57606252的博客 1486

Linux下用gcc生成静态库和动态库

gcc生成静态库和动态库

weixin_64559251的博客 1375

在Linux系统下用gcc生成静态库和动态库

通过三个程序用gcc生成使用静态库和动态库,基本上可以较为熟练的生成静态库和动态库。

m0_69726414的博客 414

gcc生成静态库.a和动态库.so

gcc生成静态库.a和动态库.so一、用gcc生成静态库和动态库1、 hello实例2、实例一3、实例二二、总结三、参考资料 一、用gcc生成静态库和动态库 1、 hello实例 2、实例一 3、实例二 二、总结 三、参考资料 ...

阿布巴的博客 2980

如何使用GCC生成动态库和静态库

如何使用GCC生成动态库和静态库 根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。而动态库是在程序执行的时候被链接的。程序执行完,库仍需保留在系统上,以供程序运行时调用。链接静态库从某种意义上来说是一种复制粘贴,被链接后库就直接嵌入可执行程序中了,这样系统空间有很大的浪费,而且一旦发现系统中有bug,就必须一一把链接该库的程序找出来,然后重新编译,十分麻烦。而动态库刚好弥补了这个缺陷,因为动态库是在程序运行时

wwwtovvv的专栏 612
上一篇: 置管理系统和整体变更系统有什么区别与联系
下一篇: Linux crontab 定时任务总结
coding_Xu
博客等级 码龄15年 11粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值