编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式
后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;
后缀为.cpp的,两者都会认为是c++程序。
注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。
为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的(当然最好就用g++)。
编译程序命令
我们用gcc编译程序时,常常会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例:
#gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
这条命令运行后,会在当前文件夹下产生一个hello文件,这个文件就是可执行文件(类似windows的hello.exe),在当前文件执行命令./hello,即可运行该文件,也就是运行后面三个C源文件。-o即out指定输出文件名。
上面这句表示在编译hello.c时:(如果有多个.c源文件联合编译,连着写就行。)
-I/home/hello/include,表示将/home/hello/include目录作为第一个寻找源代码中引入的头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include,也就是指定优先查找的目录,找不到的话查找默认目录。如果没有-I相关的指定,那么就是省略头文件位置默认为当前文件夹。
-L/home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib,同上,也是指定优先查找的目录,如果省略就是指当前文件夹优先。
-lword, 表示寻找具体的动态链接库文件libword.so(也就是文件名去掉前缀和后缀所代表的库文件),如果加上编译选项-static,表示寻找静态链接库文件,也就是libword.a。
当然也可以直接把连接库文件的全路径放过来,比如用/home/hello/lib/libword.a来代替-L/home/hello/lib -lworld。
静态库和动态库的使用区别
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
对于第三方提供的动态链接库(.so),一般将其拷贝到一个lib目录下(/usr/local/lib),或者使用-L来指定其所在目录, 然后使用-l来指定其具体名称。
一个例子
现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供sayhello()这个函数 void sayhello(); 另外还有一些说明文档。
这一个典型的程序开发包结构 与动态库连接, linux默认的就是与动态库连接,下面这段程序testlib.c使用hello库中的sayhello()函数
int main()
{
sayhello();
return 0;
}
使用如下命令进行编译 #gcc -c testlib.c ,在当前文件夹得到链接文件testlib.o,无论静态库.a,还是动态库.so,都是由.o文件创建的。
再用如下命令连接: #gcc -o test testlib.o -lhello ,在当前文件夹得到可执行文件test。
上面两步可以一步到位:#gcc -o test testlib.c -lhello (libhello.so动态库文件放在当前目录)
静态库.a和动态库.so文件的创建方式
创建静态库和动态库的方式
库的相关性处理办法
库的相关性处理办法
image.png
image.png
image.png
编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式相关推荐
- linux gcc g++编译命令选项
gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码) ...
- windows下,对opencv进行gcc/g++编译
opencv官网下载的Windows安装包有source文件夹和build文件夹,其中build文件夹是已经编译好的,里面有用于VS配置的库,source文件夹包含源码和编译配置文件,可以借助cmak ...
- MinGW下载并配置gcc/g++编译环境
本文将讲解如何下载MinGW并配置gcc\g++编译环境 #方案一:官网下载 ##一.下载MinGW 在MinGW官网中下载"mingw-get-setup.exe" 官网传送门: ...
- g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解
下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...
- linux下g编译文件或目录,【转】在linux下使用gcc/g++编译多个.h文件
博主写得很好 多个文件编译在linux下编译,下面有三个文件,分别是1.cpp 和 2.cpp 和myhead.h 文件. 1.cpp 2.cpp myhead.h 假如他们都在一个目录下面,那么编译 ...
- Linux | 编译器gcc/g++的使用【动静态库的认识】
文章目录 一.对程序的认知 && 初识gcc 1.程序是如何诞生的? 2.gcc的初步认识 3.如何使用gcc 二.gcc逐步分析程序的翻译环境 1.预编译[进行宏替换] 2.编译[C ...
- gcc/g++ 编译C/C++代码
摘要:本文介绍了在windows下编译c/c++代码的完整流程 1.安装gcc/g++编译器 官网下载地址为:https://sourceforge.net/projects/mingw-w64/fi ...
- linux gcc编译c文件头文件,使用GCC编译器编译C语言
GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...
- c语言程序可以单独编译,c语言的函数能单独进行编译吗?
c语言的函数能单独进行编译吗? 发布时间:2020-04-20 10:27:20 来源:亿速云 阅读:493 作者:小新 c语言的函数能单独进行编译吗?很多人都不太了解,今天小编为了让大家更加了解c语 ...
- 0与1c语言编译,C语言程序设计(07776-1)第11章编译预处理课案.ppt
C语言程序设计(07776-1)第11章编译预处理课案.ppt 第11章 编译预处理 主要内容 宏定义 文件包含 条件编译 程序案例 小结 习题 11-1 宏定义 不带参数的宏定义 带参数的宏定义 终 ...
最新文章
- Redis总结(五)缓存雪崩和缓存穿透等问题
- CentOS 设置网络(修改IP 网关 DNS)上网
- 一般纳米材料是指尺度为_纳米材料及纳米材料在高分子领域的应用
- 何为TransmittableThreadLocal
- java 工厂模式 计算器_java设计模式之简单工厂模式
- 企业微信加密消息体_微信公众平台开发者中心安全模式消息体加解密实现
- 苏宁:国庆节首日 电器门店订单增长50%
- python windows 消息通讯_如何使用python與windows中的事件/消息掛鈎
- 内存条hyperx_一键开启内存条最高效能 HyperX雷电系列3733MHz内存条评测
- VMware虚拟机刷openWRT
- WPS使用宏操作——减少重复性操作,提高效率
- 快速入手Web幻灯片制作
- 免费的几款内网穿透工具
- IDEA太强悍了!java导出excel合并单元格边框设置
- 腾讯云 云点播 JAVASDK上传
- 如何使用IxNetwork软件进行Avnu gPTP一致性测试?
- java图片文字自动识别
- 关于CSS选择器优先级的规则说明
- java hello_JAVA初学者——Hello,World!
- 接口测试--ssl证书
热门文章
- JS排序算法(升序)
- 苹果8怎么投屏到电视_苹果怎么投屏到电视?简单操作就用这个办法
- thinkpad x230怎么搞定的ssd的win7的启动顺序
- 绅士领域服务器不稳定,绅士云服务器
- mysql ibdata1 删除_mysql 误删除ibdata1之后的恢复方法
- 2023年之后软件测试人员何处去?一文解决所有入行人员的困惑!
- Redis实现分布式锁机制的原理
- 2022年appium超详细环境安装步骤(Mac版本,附带百度网盘安装包)
- Linux 安装TensorRT、Pycuda
- js 代码大全(各种方法、属性)