参考博客:

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环境下的编译,链接与库的使用的更多相关文章

  1. PCL库在Linux环境下的编译安装

    PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...

  2. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  3. Linux 环境下 javac 编译错误: 编码UTF8的不可映射字符 (编码UTF8/GBK的不可映射字符)

    Linux 系统下一般默认使用UTF-8编码, 使用javac 编辑使用其他编码格式编写的源吗时,会出现  “ 错误: 编码UTF8的不可映射字符 ”. 最近在使用  javac 编译 一个在wind ...

  4. 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 ...

  5. Java web项目在linux环境下自动编译和部署脚本

    自动编译脚本 build.sh, 放置在项目根目录下. #!/bin/bash # check args # init path CURRPATH=`pwd` LIBDIR="$CURRPA ...

  6. Linux环境下安装PHP的gd库

    当前使用的安装包版本: freetype-2.4.0.tar.bz2 jpegsrc.v9.tar.gz libpng-1.6.28.tar.gz 1.安装freetype tar jxvf free ...

  7. JPEG库在Linux系统下的编译和移植【转】

    本文转载自: 这篇文章介绍了jpeg库在Linux系统下的编译和移植,经过了亲自的验证,编译首先需要准备以下资源:jpegsrc.v6b.tar.gz(jpeg库),libtool-1.5.26.ta ...

  8. 从四个问题透析Linux下C++编译&链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  9. Linux 环境下 C++ 的开发编译

    Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...

随机推荐

  1. 怎样用CODESOFT打印连续的条码标签?

    在实际工作中,经常会用CODESOFT条 码打印软件来实现打印连续的条码标签,将这些标签按递增或递减等方式连续打印.这样设置可大大提高用户的工作效率.实现在CODESOFT 2015打印连续条码标签, ...

  2. spark1.4的本地模式编程练习(1)

    spark编程练习 申明:以下代码仅作学习参考使用,勿使用在商业用途. Wordcount UserMining TweetMining HashtagMining InvertedIndex Tes ...

  3. tar: 从成员名中删除开头的“/”

    在压缩文件时,当后面的备份目录使用绝对路径时,会出现: tar zcvf   /usr/OutFile.tar.gz  /data/CTest tar: 从成员名中删除开头的“/” 此时,对tar增加 ...

  4. c#中如何做日期的三元判断(日期不为空赋值)

    <dx:ASPxDateEdit runat="server" ID="edTab4_protocoldate" Width="100%&quo ...

  5. 内存泄漏检测工具Valgrind

    1概述 1.1 介绍 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(fram ...

  6. 二模10day2解题报告

    T1.最多因子数(divisors) 给出范围l,r求其中约数和最大的最小整数. 非常深井冰的题目:如果特判加暴力的话分数低的可怜 AC做法要用到分解质因数和线性筛(这俩好写),然而,一个一个枚举还是 ...

  7. APUE第五章:标准IO库

    5.2流和file对象 #include <wchar.h> int fwide(FILE *fp, int mode); Returns: positive if stream is w ...

  8. pxecfg&kickstart生成脚本

    em tm 00:00:00:00:00:12 10.180.1.12 255.255.255.0 173.45.34.25 255.255.255.225 173.45.34.1 em tm 00: ...

  9. zedboard如何从PL端控制DDR读写(二)——AXI总线

     虽然Xilinx已经将和AXI时序有关的细节都封装起来,给出了官方IP和向导生成自定义IP,用户只需要关注自己的逻辑实现,但是还是有必要简单了解一下AXI的时序,毕竟咱是做硬件设计的. AXI(Ad ...

  10. 谈谈 React.js 的核心入门知识

    近来React.js变得越来越流行,本文就来谈一谈React.js的入门实践,通过分析一些常用的概念,以及提供一些入门 的最佳编程编程方式,仅供参考. 首先需要搞懂的是,React并不是一个框架,Re ...