GNU Compile Tools, 可执行文件, 静态链接库, 动态链接库

原创 2006年06月01日 16:52:00

Compile Process


对于一个编译型语言,编译器工作时总要经过预处理、编译、链接等几个过程。以 C/C++ 为例:预处理器(cpp)将每个 .c/.cpp 文件中 #include 的头文件都合并到 .c/.cpp 文件中,并且对其进行宏扩展,由此生成数个编译单元。一般来说每个 .c/.cpp 文件对应一个编译单元。随后,编译器(cc)将每个编译单元翻译成本地二进制代码,在 GNU/Linux 中后缀是 .o,在 ms vc 中后缀 .obj。这种二进制代码又被称为 object 文件,和最终的目标文件一样也有 code, data, heap, statck 等数据段,但却不可以被运行(缺少入口点)。链接器(ld)将多个 object 文件在目标文件中重新定位,也就是 relocate 的过程,再加入额外的一些代码(其他的链接文件),最终生成目标文件。目标文件可以是可执行文件,静态链接文件,或者动态链接文件。


Make static or shared library

在 GNU/Linux 系统中静态链接文件实际上就是多个 .o 文件的压缩包。假设我们有 cool.h cool.c 和 some.c 文件,要得到静态链接库 libcool.a。首先使用如下指令得到相应的 object 文件 cool.o 和 some.o:

    gcc -c cool.c

    gcc -c some.c

用这种方法生成的 object 文件称为 PDC 即位置相关代码(position-dependence code)。再使用如下指令可以得到静态链接文件 libcool.a:

    ar -r libcool.a cool.o some.o
    ranlib libcool.a

静态链接库 libcool.a 遵从 GNU/Linux 规定的静态链接库命名规范,必须是"libyour_library_name.a"

在 GNU/Linux 中动态链接文件,必需通过链接器 ld 生成。假设我们有 hot.c other.c 等文件要生成动态链接库 libhot.so 。首先使用如下指令得到相应的 object 文件 hot.o 和 some.o

    gcc -fPIC -c hot.c
    gcc -fPIC -c other.c

参数 -fPIC 指定生成的 object 文件为位置无关代码(position-independence code),只有 PIC 可以被用作生成动态链接库。然后使用如下指令得到动态库:
   
    ld -Bshared -o libhot.so hot.o other.o

或者可以使用编译器的ld wrapper:
   
   
gcc -shared -o libhot.so hot.o other.o

也可以使用编译器直接生成动态库:

   
gcc -fPIC -shared -o libhot.so hot.c other.c

这里选项 -shared 指示目标文件的类型是动态链接库,动态库的命名规范是"libyour_library_name.so"


Link static or shared library

上面提到,在链接过程中需要从其他的链接文件中引入一些额外的代码,比如:在我们的程序里用到了 jpeg 的解码函数我们就需要从 libjpeg 中导入我们需要的函数

待续...

GNU Compile Tools, 可执行文件, 静态链接库, 动态链接库

...
  • guowake
  • guowake
  • 2008年03月20日 17:21
  • 449

GNU Compile :可执行文件, 静态链接库, 动态链接库

对于一个编译型语言,编译器工作时总要经过预处理、编译、链接等几个过程。以 C/C++ 为例:预处理器(cpp)将每个 .c/.cpp 文件中 #include 的头文件都合并到 .c/.cpp 文件中...
  • u011839461
  • u011839461
  • 2013年10月08日 10:50
  • 506

动态链接库,静态链接库和可执行文件的区别是什么?

动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、...
  • huangbangqing12
  • huangbangqing12
  • 2015年03月26日 18:44
  • 2084

静态链接库与动态链接库区别

一、        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使...
  • u011404663
  • u011404663
  • 2016年02月25日 18:19
  • 1959

静态链接库与动态链接库----C/C++

静态链接库和动态链接库
  • freestyle4568
  • freestyle4568
  • 2015年11月13日 17:18
  • 8560

介绍静态链接库和动态链接库的区别,及在VC++6.0中的建立和使用

首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 下面讲解一下动态库和静态库在VC6.0中的使用方法 先来讲解静态库的创建和使用方法...
  • BBOOT
  • BBOOT
  • 2014年06月20日 12:30
  • 1262

静态链接库(lib)和动态链接库(dll)的区别和使用

一,概念         1)静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。          使用方法    1>  ...
  • zang141588761
  • zang141588761
  • 2016年01月12日 09:53
  • 4191

静态链接库与动态链接库的优缺点

1 静态链接库的优点   (1) 代码装载速度快,执行速度略比动态链接库快;   (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文...
  • left_la
  • left_la
  • 2013年09月27日 16:10
  • 21082

GNU libtool使用简介

1.简介    以前,如果你是一名源代码包开发者,你想要利用共享库带来的优势,你需要为每一种平台编写特定的代码以使你的代码可以运行。同时你可能需要设计一个配置文件接口,所以包的安装者可以选择哪些库需...
  • linux_embedded
  • linux_embedded
  • 2014年04月10日 21:47
  • 2015

NDK学习笔记:动态链接库与静态链接库的基本使用流程简记

背景最近做了一段时间的项目中涉及到一些ffmpeg视频编解码的应用和OpenCV算法在Android的使用,其中免不了需要使用jni在java层调用相关算法的内容,尤其当业务逻辑复杂时还需要cpp层调...
  • lidec
  • lidec
  • 2016年11月19日 15:26
  • 5985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GNU Compile Tools, 可执行文件, 静态链接库, 动态链接库
举报原因:
原因补充:

(最多只允许输入30个字)