后缀为.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++源程序,静态库和动态库创建方式相关推荐

  1. linux gcc g++编译命令选项

    gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码) ...

  2. windows下,对opencv进行gcc/g++编译

    opencv官网下载的Windows安装包有source文件夹和build文件夹,其中build文件夹是已经编译好的,里面有用于VS配置的库,source文件夹包含源码和编译配置文件,可以借助cmak ...

  3. MinGW下载并配置gcc/g++编译环境

    本文将讲解如何下载MinGW并配置gcc\g++编译环境 #方案一:官网下载 ##一.下载MinGW 在MinGW官网中下载"mingw-get-setup.exe" 官网传送门: ...

  4. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

  5. linux下g编译文件或目录,【转】在linux下使用gcc/g++编译多个.h文件

    博主写得很好 多个文件编译在linux下编译,下面有三个文件,分别是1.cpp 和 2.cpp 和myhead.h 文件. 1.cpp 2.cpp myhead.h 假如他们都在一个目录下面,那么编译 ...

  6. Linux | 编译器gcc/g++的使用【动静态库的认识】

    文章目录 一.对程序的认知 && 初识gcc 1.程序是如何诞生的? 2.gcc的初步认识 3.如何使用gcc 二.gcc逐步分析程序的翻译环境 1.预编译[进行宏替换] 2.编译[C ...

  7. gcc/g++ 编译C/C++代码

    摘要:本文介绍了在windows下编译c/c++代码的完整流程 1.安装gcc/g++编译器 官网下载地址为:https://sourceforge.net/projects/mingw-w64/fi ...

  8. linux gcc编译c文件头文件,使用GCC编译器编译C语言

    GCC编译C源代码有四个步骤:预处理-->编译-->汇编-->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程. 下面将通过对一个程序的编译来演示 ...

  9. c语言程序可以单独编译,c语言的函数能单独进行编译吗?

    c语言的函数能单独进行编译吗? 发布时间:2020-04-20 10:27:20 来源:亿速云 阅读:493 作者:小新 c语言的函数能单独进行编译吗?很多人都不太了解,今天小编为了让大家更加了解c语 ...

  10. 0与1c语言编译,C语言程序设计(07776-1)第11章编译预处理课案.ppt

    C语言程序设计(07776-1)第11章编译预处理课案.ppt 第11章 编译预处理 主要内容 宏定义 文件包含 条件编译 程序案例 小结 习题 11-1 宏定义 不带参数的宏定义 带参数的宏定义 终 ...

最新文章

  1. Redis总结(五)缓存雪崩和缓存穿透等问题
  2. CentOS 设置网络(修改IP 网关 DNS)上网
  3. 一般纳米材料是指尺度为_纳米材料及纳米材料在高分子领域的应用
  4. 何为TransmittableThreadLocal
  5. java 工厂模式 计算器_java设计模式之简单工厂模式
  6. 企业微信加密消息体_微信公众平台开发者中心安全模式消息体加解密实现
  7. 苏宁:国庆节首日 电器门店订单增长50%
  8. python windows 消息通讯_如何使用python與windows中的事件/消息掛鈎
  9. 内存条hyperx_一键开启内存条最高效能 HyperX雷电系列3733MHz内存条评测
  10. VMware虚拟机刷openWRT
  11. WPS使用宏操作——减少重复性操作,提高效率
  12. 快速入手Web幻灯片制作
  13. 免费的几款内网穿透工具
  14. IDEA太强悍了!java导出excel合并单元格边框设置
  15. 腾讯云 云点播 JAVASDK上传
  16. 如何使用IxNetwork软件进行Avnu gPTP一致性测试?
  17. java图片文字自动识别
  18. 关于CSS选择器优先级的规则说明
  19. java hello_JAVA初学者——Hello,World!
  20. 接口测试--ssl证书

热门文章

  1. JS排序算法(升序)
  2. 苹果8怎么投屏到电视_苹果怎么投屏到电视?简单操作就用这个办法
  3. thinkpad x230怎么搞定的ssd的win7的启动顺序
  4. 绅士领域服务器不稳定,绅士云服务器
  5. mysql ibdata1 删除_mysql 误删除ibdata1之后的恢复方法
  6. 2023年之后软件测试人员何处去?一文解决所有入行人员的困惑!
  7. Redis实现分布式锁机制的原理
  8. 2022年appium超详细环境安装步骤(Mac版本,附带百度网盘安装包)
  9. Linux 安装TensorRT、Pycuda
  10. js 代码大全(各种方法、属性)