传统意义上的编译程序分两步走 —— 编译和链接:

1.编译(compile):指用编译器(compiler)将源代码(source code)生成二进制目标文件(object file),在Windows下也就是 .obj 文件,UNIX下是 .o 文件。编译时,编译器需要的是语法的正确,函数与变量的声明的正确,编译器只检测程序语法,和函数、变量是否被声明,函数并不需要被定义。

UNIX下g++的语法为:
        g++ -c file.cpp

-c 是compile的意思,此命令将会生成 file.o 的目标文件。

2.链接(link):找到所要用到函数所在的目标文件,并把它们链接在一起合成为可执行文件(executable file)。链接时,要确保编译器能找到所有被用到了的函数所在的目标文件。

g++ file1.o file2.o -o program.exe

-o 是指定生成的可执行文件名称(output)。若不给出,默认的名称为 a.out

上述两部通常也可以合在一起完成:

g++ file1.cpp file2.cpp -o program.exe

这完全等同于上面两步的结合,会先生成目标文件,然后链接成 file.exe

3. 库 (library)

对于一个源文件很多的大项目,为了避免重复编译,也为了方便编译器链接,通常会把一些常用到的目标文件打包(archive),于是就成为了传说中的库文件(library)。在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

UNIX 所要用到的命令:
1)ar -- create, modify, and extract from archives.
@Usage: ar cr lib****.a file1.o file2.o
**** 为自定义的库文件名。
标签 c (create):如果库不存在,则创建库;
标签 r (replace):如果库中已存在要添加的对象文件,则旧的对象文件将被替换。

实际上 ar 只是一个打包工具,是archive(打包)的首字母。它将一系列的目标文件首位连接在一起,并内嵌一个索引表,使得编译器能够方便地找到所需要的函数。一般来说,由于函数索引表的存在,对库的链接要比对一般的对象文件的链接更快。如果 ar 未能完成此项索引表工作,还可以手动用以下的 ranlib 命令创建索引表。

2) ranlib -- generate index to archive.
@Usage: ranlib lib****.a

3) nm -- list symbols from object files.

nm可以用来显示 ranlib 所构建的索引表。你将会看到所有库里的函数名(除了模板函数template function)。

4. 在编译时链接库

创建了自己的库,以后要用到相关函数的时候,只需在代码中声明所要用的函数(必须和库中定义得相同)。在链接的时候,需要给出库的名称和位置:

g++ file1.o file2.o -o program.exe -L**** -l****

-L 后紧跟库文件所在的目录地址,-l 后紧跟库名。

编译器在链接的时候会在所指定的目录地址下寻找名为 lib****.a 的库文件。

源地址:http://www.cppblog.com/deane/articles/113950.html

最新文章

  1. JQuery Sizzle引擎源代码分析
  2. jquery如何在异步方式中给全局变量赋值
  3. Scala映射
  4. 【吉光片羽】ie6兼容性的几个点
  5. Codeforces Round #281 (Div. 2)
  6. lintcode :旋转字符串
  7. JVM参数配置大全
  8. 一次搞懂 Assets Pipeline 转载自http://gogojimmy.net/2012/07/03/understand-assets-pipline/
  9. 【c语言】模拟库函数strstr
  10. Docker系列一之基础快速入门企业实战
  11. java-随机生成用户名(中文版及英文版)
  12. Beyas定理
  13. 【easy】479. Largest Palindrome Product
  14. CFUpdate高速模式下出现Error #2038提示的解决方案
  15. 关于redis的安装
  16. 初见SDN
  17. 26.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(2)
  18. unsupported time zone specified undefined
  19. 客户端连接linux经常间隔性断开链接【转】
  20. Vmware 安装centos7与网络配置

热门文章

  1. Lua学习笔记(二):基本语法
  2. [置顶] 文件和目录(二)--unix环境高级编程读书笔记
  3. 利用 SQL Monitor 查看语句运行状态步骤
  4. Win7激活后添加grub引导Linux最简单方法
  5. 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML
  6. Caching in ASP.NET MVC
  7. xampp
  8. UIDatePicker的时间选择器里的时区的问题
  9. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
  10. B - 一行盒子