18.3.1.4 连接
连接器将多个二进制的object文件连接成为一个可执行文件,在进程中,它完成使用外部引用来替换程序中本地对象的引用。连接器依据汇编器提供的符号表来完成这些工作。
此外,连接器必须为程序中使用的C标准库的函数添加代码,在连接的上下文中,一个库就是一系列object文件的集合,为了便于处理,它们以归档文件的形式被集合在一个独立的文件中。
大多数标准函数库通常在文件libc.a中(其中后缀.a代表“archive”),或者在一个共享的动态连接库libc.so中( 其中后缀.so代表“shared object”)。这些库通常在/lib/ 或/usr/lib中,或者在GCC默认的其他库目录中存放。
特定的函数存放在各自己的库文件中,比如标准库中的浮点数函数。为了示范如何连接这些库,让我们使用其他的变量来替代circle.c中p的定义,在Example 1-1中,变量pi使用一个常量来初始化:
const double pi = 3.1415926536; // Pi is a constant
我们可以使用反正切函数来替换,如下:
const double pi = 4.0 * atan(1.0); // because tan(pi/4) = 1
当然我们要在源文件的头部添加指示符#include <math.h>,但函数atan() 没有在源代码中定义,也不在libc.a中,编译此circle.c文件,我们要使用-l选项来连接math库。
$ gcc -o circle -lm circle.c
math库的文件名为libm.a(在支持动态库的系统 上,GCC自动使用共享动态库libm.so,如果它可用,可以查看后面的“动态连接与共享object文件”一节来获取更多信息),其中前缀lib和或缀.a均为标准命名要求,当在命令行中基本名称跟随参数-l时,GCC自动扩展它们,例如m。
通常,GCC在标准库所在目录中根据库文件名称来自动查找,例如/usr/lib。有三种连接一个库的方式,其中之一是给GCC提供全路径和库文件名,就像object文件一样,例如,假设库文件名为libmath.a,存放在/usr/local/lib中,如下的命令将使用GCC编译circle.c,然后连接器将结果文件circle.o与libmath.a进行连接:
$ gcc -o circle circle.c /usr/local/lib/libmath.a
本例中,库的名子必须放置在使用它的源文件或object文件之后,这是因为连接器在命令中顺序地使用这些文件,并且不会返回到一个前面的库文件来解决一个后面对象中的引用。
第二种方不在GCC默认路径中连接的方式是使用-L选项来添加另一个库的目录来让GCC查找:
$ gcc -o circle -L/usr/local/lib -lmath circle.c
你可以使用多个-L选项来添加多个库目录,或者使用一个-L选项,后跟随一个目录列表;第三种方式是确保你所引用库的路径在环境变量LIBRARY_PATH中。
你可以直接传递选项参数到连接阶段,使用-Wl选项,后跟一个使用逗号分隔的列表,如下:
$ gcc -lm -Wl,-M circle.c circulararea.c > circle.map
命令行中的选项-Wl传递-M给连接器,指示连接器在标准输出上打印一个连接和一个内存印象文件。
-Wl后的列表必须以逗号开始,且不包含空格,如果不确定,你可认在同一个GCC命令行中使用多个-Wl选项,使用-v选项来查看连接器的结果。
分享到:
相关推荐
02H3 C VEPC3200核心网故障处理手册pdf 03H3CBBU3100系列基带处理单元故障处理手册,p 04H3 C VEPC3200产品开局自检手册pdf 05H3 C VMEGW3200技术白皮书pdf 06移动通信技术概述pdf 07H3CEPC3108核心网特性手册(E2123)...
C程序员在编写程序时手头一定要有这本书。在这本书中,C 语言专家 Peter Prinz和Tony Crawford为你提供大量的编程参考信息。全书叙述清晰,语句简洁,分析深刻。本书主题包括: C 语言的语法、GNU编译器选项、标准...
·提供了mysql语句、函数、配置选项和实用工具的一个完整手册。 ·给出了几个指导章节用于帮助新手入门。 ·为php、perl和c语言提供了应用程序编程接口(api)。 ·在每章的api开头部分提供了简要的指南。 ...
C语言核心技术是C语言工程师常用的手册知道,是外文翻译过来的,通俗易懂,适合初学者以及开发人员
目前还没翻译完成,持续更新中,第一次翻译,遇到其中的错误请大家留言提醒,谢谢。
ALIENTEK STM32H750核心板底板 PDF原理图+AD集成封装库+主要器件技术手册: 集成封装库: 3.5TFTLCD封装库.IntLib ATK-4.3' TFTLCD电容触摸屏模块_V1.2.IntLib ATK-4342 4.3寸RGB屏模块封装库.IntLib ATK-7016&7084 ...
迅为iTOP4412核心板配套开发底板ALTIUM设计硬件(原理图+PCB)+核心器件技术手册,2层板设计,大小为192x108mm,双面布局布线,Altium Designer 设计的工程文件,包括完整的原理图及PCB文件,可以用Altium(AD)软件打开...
书名:JSP 2.0 技术手册(电子书) 格式:PDF 出版:电子工业出版社 作者:林上杰、林康司 本书图文并茂,以丰富的实例为引导,全面介绍了主流的 Java Web 开发技术—— JSP 2.0,重点介绍Java在展示层的两项重要技术...
迅为iTOP4412核心板配套开发底板cadence设计硬件(原理图+PCB)+核心器件技术手册,2层板设计,大小为192x108mm,双面布局布线,cadence 设计的原理图PCB工程文件,包括完整的原理图及PCB文件,可以用Altium(AD)软件...
C++核心编程技术 .rar http://down.qiannao.com/space/file/yuexingchen2/-4e0a-4f20-5206-4eab/C-002b-002b-0020-0020-00b7C-0020-0020vc/C-002b-002b-6838-5fc3-7f16-7a0b-6280-672f-0020.rar/.page C程序100例 ....
这是一套Java核心技术基础使用手册,包含Java 基础核心总结、Java核心基础、Java核心知识、Java 基础面试题总结等,内含最强 Java 核心知识点整理及思维导图,需要的朋友可下载试试! Java是一门编程语言,Java发展...
ALIENTEK STM32F750核心板+开发底板PDF原理图+AD集成封装库+主要器件技术手册,ALTIUM集成封装库器件列表: Library Component Count : 63 Name Description ----------------------------------------------------...
STM32F767单片机核心板+开发底板PDF原理图+AD集成封装库+主要器件技术手册:3710FXXX037XXFX01.pdf 3710MXXX046XXFX01.pdf AMS1117.pdf AP3216C.pdf AT24C02.pdf AT8574_8574A_DS001V1.2.pdf CAT6219.pdf CH340.pdf ...
H3C S9500系列交换机是H3C公司面向以业务为核心的企业网络架构而推出的新一代核心路由交换机,该产品基于H3C公司自适应安全网络的技术理念,在提供大容量、高性能L2/L3交换服务基础上,进一步融合了硬件IPv6、网络...
·提供了mysql语句、函数、配置选项和实用工具的一个完整手册。 ·给出了几个指导章节用于帮助新手入门。 ·为php、perl和c语言提供了应用程序编程接口(api)。 ·在每章的api开头部分提供了简要的指南。 ...
ALIENTEK STM32F767(核心板+开发底板)PDF原理图+AD集成封装库+主要器件技术手册,集成封装库部分型号器件列表: AMS1117 AP3216C ALS+PS Sensor ATK-HC05 ATK-HC05 BAT BEEP BUTTON C CAP CH340G USB2UART D DB...
TI基于KeyStone的8核固定浮点数字信号处理器,DSP集成C66x CorePac,每个核心在1至1.25 GHz到10 GHz的运行。
H3C MSR 50系列多业务开放路由器包含MSR 50-40和MSR 50-60两款设备,该系列产品可以为大型分支机构提供高性能、多业务的一体化网络方案,也可以作为大中型企业的核心网络设备,完成数据、语音、视频等多种流量的广域...