Linux环境下的编译,链接与库的使用
参考博客:
http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html
http://m.blog.csdn.net/article/details?id=24421919
一、GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接
四阶段作用:(对应文件后缀依次是:.i>.s>.o>.exe)
》预处理 将引进的头文件的代码加入到当前文件中。选项"-E"预处理。 用法:gcc -E hello.c –o hello.i
》编译 Gcc首先要检查代码的规范性、是否有语法错误等,在检查无误后,Gcc把代码翻译成汇编语言。选项"-S"预处理。 用法:gcc -S hello.i –o hello.s.(该选项只进行编译而不进行汇编,生成汇编代码。)
》汇编 汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码。选项"-c"预处理。 用法:gcc -c hello.s –o hello.o。
》链接 在成功编译之后,就进入了链接阶段。无选项链接 用法:gcc hello.o –o hello.exe。
注释:
在链接阶段,编译器其实是将系统标准头文件对应的实现体编译所称的对应的链接库,如stdio.h对应的名为libc.so.6的库文件,链接进入自己汇编后生成的.o文件中。最终生成可执行程序。
可以用ldd命令查看动态库加载情况。
函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,如前面所述的libc.so.6就是动态库。gcc在编译时默认使用动态库。
二、关于GCC/G++ 重要参数,及与动态库和静态库。关于两者的区别请参考我之前的文章:关于动态链接库与静态链接库
1. -I 编译阶段指定依赖库的头文件路径,便于找到其头文件,此阶段只编译,不链接。
2. -L libpath -llibname 连接阶段指定依赖的库(静态库/动态库)的名字、存放路径。
3. 编译静态库时,只编译不链接,所以如果该库依赖其他库时,最后生成执行程序时需要链接就会报错
4. 编译动态库时,即编译,又链接,运行时加载动态库
5. 对于大的项目,系统自己的库文件、第三方库文件比较多
生成执行程序时,链接库时,是按照从右向左编译-l指定的库的方式编译的,如果这些参数顺序与实际的依赖关系不符,则链接出现"undefined reference to ×××"这样的错误。
建议梳理清楚库之间的依赖关系,被依赖的库放在右边,这样就可以避免此等问题的出现。
当然也可以让编译器根据程序的依赖关系自动编译 -Xlinker "-(" -lmcsdbacc -lmcslibs -lmcsbase -lmsgptc -Xlinker "-)" 这样就避免依赖关系与编译参数关系不符导致链接错误,但是同时会增加编译时间;
Linux环境下的编译,链接与库的使用的更多相关文章
- PCL库在Linux环境下的编译安装
PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
- Linux 环境下 javac 编译错误: 编码UTF8的不可映射字符 (编码UTF8/GBK的不可映射字符)
Linux 系统下一般默认使用UTF-8编码, 使用javac 编辑使用其他编码格式编写的源吗时,会出现 “ 错误: 编码UTF8的不可映射字符 ”. 最近在使用 javac 编译 一个在wind ...
- Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集
近期升级了系统到Mac OS X 10.10 而且更新了XCode6.1和iOS 8.1 之前app用到的libmp3lame.a静态库.也要支持64位的模拟器(x86_64)和64位的真机(arm6 ...
- Java web项目在linux环境下自动编译和部署脚本
自动编译脚本 build.sh, 放置在项目根目录下. #!/bin/bash # check args # init path CURRPATH=`pwd` LIBDIR="$CURRPA ...
- Linux环境下安装PHP的gd库
当前使用的安装包版本: freetype-2.4.0.tar.bz2 jpegsrc.v9.tar.gz libpng-1.6.28.tar.gz 1.安装freetype tar jxvf free ...
- JPEG库在Linux系统下的编译和移植【转】
本文转载自: 这篇文章介绍了jpeg库在Linux系统下的编译和移植,经过了亲自的验证,编译首先需要准备以下资源:jpegsrc.v6b.tar.gz(jpeg库),libtool-1.5.26.ta ...
- 从四个问题透析Linux下C++编译&链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- Linux 环境下 C++ 的开发编译
Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...
随机推荐
- 应用层(一)HTTP服务访问基本流程和HTTP报文详解
HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...
- Centos7 Openstack - (第一节)基本环境配置
Centos7 install Openstack - (第一节)基本环境配置 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文 ...
- 把数组转换成sql中能使用的字符串
1.数组对象转换成字符串,拼接成符合sql语句的语法 2.代码如下例子 public static void testString(){ String[] str=new String[ ...
- java中HashMap的用法
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- JS HasMap使用
function HashMap() { var size = 0; var entry = new Object(); this.put = function (key, value) { entr ...
- MFC启动和关闭线程
1. 启动线程: CWinThread* AfxBeginThread( 线程函数,this ); 2.通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行.如果字处理器使用后台打印线程,若 ...
- Sass基础语法
Sass是CSS3语言的扩展,在CSS的基础之上添加了新特性和语法,能省事地写出更好的样式表.Sass引擎是基于Ruby的. 导入Sass文件: @import "colors" ...
- Datatable导出Excel
; IRow headerRow = sheet.CreateRow(); ; ; ; iRowIndex++; } ; i < icolIndex; i++) { sheet.AutoSize ...
- 优秀的富文本编辑器 Kindeditor
<textarea name="txtbody" style="width:100%;height:320px;" > {$article.txt} ...
- javaSE第二十七天
第二十七天 447 1:反射(理解) 447 (1)类的加载及类加载器 447 (2)反射: 448 A:定义 448 B:获取字节码对象的三种方式 449 (3) ...