linux-编译和添加库和头文件路劲

一、创建动态库和静态库 从源代码到可执行程序,通常要经过最重要的两大步是:编译,链接。编译就是将源文件生成中间文件的过程,在linux下就是生成 .obj 文件。链接就是用链接器将,这些个中间文件有序地”糅合“在一起,构成一个可执行文件。通常,一个.c文件或者.cpp源文件编译后,就会对应生成一个.obj文件。 那么库文件是什么东西呢?其实库文件就是将这些中间文件.obj进
摘要由CSDN通过智能技术生成

一、创建动态库和静态库
从源代码到可执行程序,通常要经过最重要的两大步是:编译,链接。编译就是将源文件生成中间文件的过程,在linux下就是生成 .obj 文件。链接就是用链接器将,这些个中间文件有序地”糅合“在一起,构成一个可执行文件。通常,一个.c文件或者.cpp源文件编译后,就会对应生成一个.obj文件。
那么库文件是什么东西呢?其实库文件就是将这些中间文件.obj进行打包生成的文件。那么为什么要将这些obj文件打包成库文件呢?一个很重要的原因是,方便代码复用。通常,我们都会有自己写的一些公用的函数,一般是一些工具类的函数。然后再不同的项目中,经常会引用到这些公用的函数。显而易见的做法是,将公用函数的.h文件和.cpp文件分别丢到某个项目的.h文件目录或.cpp文件目录中,编译的时候也跟对待其他的源文件一样调用g++或者gcc进行编译。如果是引用的第三方文件不多还好,要是使用到了一些大型的第三方库比如zlib,openssl等,那么编译这些库都得花很长的时间。
那么那些懒的程序员就想到了一个办法,只编译一次,并将这些第三方库编译后生成的中间文件全部保留下来,下次可以直接用了。那么又来了个问题,加入某个第三方库有许多源文件,那岂不是要保存好多.obj文件??至少看起来,目录都是乱糟糟的。因此,就想到了一个办法将这些个.obj文件打包起来放在一起,也就产生了所谓的库文件。
链接的时候又有问题了,如果这些第三方库很大或者很多,直接将项目自己的中间文件跟第三方库文件链接成可执行程序,最终这个程序一定非常臃肿,挺占空间。而且关键是,执行程序的时候,会将程序丢到内存里去,那么如果多个程序同时调用了这些第三方库,那么在内存里,可能会存在两份第三方库的拷贝,貌似挺占内存。好的,聪明的程序员又想到好办法了,生成动态库,链接的时候不会将第三库文件”糅合“进可执行程序中,程序占的硬盘变小了。第二,当程序运行时,会将第三方库丢进内存中,但是如果有多个程序也动态链接了这个第三方库,内存中只会有一份拷贝,也就是多个程序共享一个第三方库,哈,内存占用解决了。

三.制作库文件
1,制作静态库文件
使用linux下的ar命令可以打包中间文件生成静态库文件。通过man ar查看ar的具体用法。一般可以使用 ar -crv 来产生静态库。比如:
g++ -g -c add.cpp 生成add.o
g++ -g -c sub.cpp 生成sub.o
ar -crv libmymth.a add.o sub.o生成归档文件,也就是我们的静态库文件。
2 ,制作动态库文件
g++ -fPIC -g -c add.cpp 生成add.o
g++ -fPIC -g -c sub.cpp 生成sub.o
-fPIC选项是为了生成与地址无关的编译程序,这样让中间文件能够在多个程序中共享
g++ -shared -o libmymath.so add.o sub.o 生成相应的动态库
或者直接合成一步:
g++ -shared -fPIC -o libmymath.so add.cpp sub.cpp

四.使用库文件
动态库或者静态库都可以在链接的时候,使用 -l 进行链接。但是要注意的是,-l 选项只会在特定的目录里去寻找指定的库文件。这些特定的目录指的是 /usr/lib,还有 LDLIBRARYPATHld

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值