Linux环境下的编译,链接与库的使用

时间:2023-02-11 11:42:24

参考博客:

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. linux下 GCC编译链接静态库&动态库

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Linux环境下使用VSCode编译makefile文件的注意事项

    Linux环境下使用VSCode编译makefile文件的注意事项 首先安装C/C++的两个依赖 在debug,launch会自动的生成下方的launch.json launch.json { // ...

随机推荐

  1. easyUI的dateBox控制时间格式

    <input type='text' name='yearQuery' class='easyui-datebox ' data-options="formatter:myformat ...

  2. JSON&&num;160&semi;和&&num;160&semi;XML&&num;160&semi;优缺点的比较

    JSON 和 XML 优缺点的比较 1.JSON定义(JavaScript Object Notation) 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换 ...

  3. 关于spring 事物传播性的研究

    spring的一大特色就是数据库事务管理方便,我们在代码中编写代码时,看不到事务的使用,关键是spring 使用了AOP进行事务拦截.   这篇文章主要介绍spring的事务传播性.   1.为什么要 ...

  4. java&amp&semi;c&num; dec 加密,通用

    java /** * 解密DES * @param key 密钥,长度必须是8的倍数 * @param data 数据源 * @return 解密内容 */ public final static S ...

  5. php 之 注册审核&lpar;0523&rpar;

    当注册后,先将信息保存到session,通过审核后才会添加到数据库中, 审核通过后状态变为已通过,这时添加到数据库中的信息进行登录.若发现此用户的不良行为,可以撤销通过. 注册页面: <!DOC ...

  6. Java文件上传细讲

    什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...

  7. Java【第九篇】异常处理

    异常概述 介绍 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等.捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生.对于这些错误, ...

  8. MySQL 8&period;0&period;14 新的密码认证方式和客户端链接

    MySQL 8.0.14 新的密码认证方式和客户端链接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   MySQL8.0在密码认证方式发生了改变,这也是有点小伙伴在MySQL创建 ...

  9. 使用AutoMapper时Expression的转换

    此文章为转载:http://www.bubuko.com/infodetail-699735.html 参考链接: http://q.cnblogs.com/q/34480/   dudu有回复,其中 ...

  10. html css 伪样式

    伪类的分类及作用: 引自W3School教程伪元素的分类及作用: 这里就不进行多的描述,原文地址:http://www.it165.net/design/html/201406/2643.html