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

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

g++ 编译和链接(转)的更多相关文章

  1. 学习总结:gcc/g++ 编译与链接

    gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...

  2. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  3. g++编译流程

    测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ...

  4. linux下使用g++编译cpp工程

    C++编程中相关文件后缀 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #includ ...

  5. g++编译总结

    g++编译&&gdb调试&&coredump调试 一.编译注意细节 1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了 ...

  6. C/C++程序从编译到链接的过程

    编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...

  7. Linux-编译器gcc/g++编译步骤

    gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...

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

    参考博客: http://www.cnblogs.com/qytan36/archive/2010/05/25/1743955.html http://m.blog.csdn.net/article/ ...

  9. gcc和g++编译c或者c++文件碰到的问题

    gcc和g++都是GNU(组织)的一个编译器.        误区一:gcc只能编译c代码,g++只能编译c++代码      两者都可以,但是请注意:      1.后缀为.c的,gcc把它当作是C ...

随机推荐

  1. Qt + CURL + mimetic 发送邮件(带附件)

    使用了大名鼎鼎的CURL 开源库,以及mimetic开源库. CURL支持N多协议.功能超强,但是不能直接发邮件附件,需要自己拼mime.太麻烦,于是乎~~ mimetic主要用于构造邮件mimeti ...

  2. c# 如何使用DLL的config文件中的信息

    我知道用c#编写的exe程序可以读取config文件中的配置信息,比如Test.exe,可以在与Test.exe相同目录下放置一个config文件:Test.exe.config,用System.Co ...

  3. 基于 Paramiko 的 SSH 通讯类

    # -*- coding: UTF-8 -*-import paramikoimport time################################################### ...

  4. cocos2d-x 纹理源码分析

    转自:http://blog.csdn.net/honghaier/article/details/8068895 当一张图片被加载到内存后,它是以纹理的形式存在的.纹理是什么东西呢?纹理就是一块内存 ...

  5. jsp页面用el表达式获取枚举的code

    jsp页面用el表达式获取枚举的code <c:set var="D_BUSINESS" value="<%=DeptEnum.D_BUSINESS%> ...

  6. 目录启动CXF启动报告LinkageError异常以及Java的endorsed机制

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ Exception in thread "main" java.lang.LinkageError: JA ...

  7. Ubuntu 15.04下MySQL 5.6.25不支持中文解决办法

    Ubuntu 15.04下MySQL 5.6.25不支持中文解决办法,apt-get install 安装的,不是源码包安装的mysql. 1 修改mysql的配置文件 /etc/mysql/conf ...

  8. Codeforces Round #332 (Div. 2) B. Spongebob and Joke 水题

    B. Spongebob and Joke Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/599 ...

  9. 怎样拷贝整个目录并且忽略部分文件及目录(包括windows)

    http://www.dewen.org/q/2150 rsync -a --exclude dir1 --exclude dir2 ... source target

  10. 面向对象设计原则OO

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...