1.gcc和g++
    1.1搞清楚几个名字
        GCC :GNU Compiler Collection (GUN编译套件),可以编译c,c++,java,objective-c,Fortran等语言。
        gcc :GCC中的 GUN C Compiler(C 编译器)
        g++:GCC中的GUN C++ Compiler(C++编译器)
    
    1.2 编译过程
        .c—>.i—>.s—>.o—>可执行文件
        预处理: .c —>.i  (宏替换,去掉注释,引入头文件) gcc -E
        编译: .i—>.s  (生成汇编代码) gcc -S
        汇编: .s —>.o  (汇编代码转化为机器码)gcc -c
        链接:.o —> 可执行程序(调用链接器ld来链接目标文件生成可执行文件)
    
    1.3 gcc的调用过程    
       当在调用gcc时,并不是直接调用的c语言的编译器,实质上它根据要编译的文件是.c结尾还是.cpp结尾来确定使用c语言编译器还是c++编译器。在使用gcc和g++来编译c++文件时,gcc不能链接c++的一些库,所以编译c++时最好使用g++。在编译阶段,g++会调用gcc。
 
2.动态链接库与静态链接库
    2.1 静态链接库
         中间文件在windows下为.obj,在linux下为.o,windows下.obj的集合就是.lib,linux下.o的集合就是.a
        .a或者.lib称为静态链接库,通过静态库编译出的程序一般都很大,而且静态库如果发生变化就要重新编译生成可执行程序,但是编译后不依赖外部文件就可以运行
        linux下创建静态库:ar 
            ar的参数:
                r:插入模块到库中,如果库中存在改模块,替换
                s:写入一个目标文件到库中,或者更新该目标文件
                v:程序执行时显示详细信息
                t:显示打包文件中所包含的文件
                d: 删除
                q:添加
        ar  -rv   libmytest.a  test1.o  test2.o   
    2.2 动态链接库    
        .so或者.dll称为动态连接库,程序在执行到动态库中的函数才调用相应函数,编译的时候不会整和到可执行程序中,所以可执行程序一般比较小,并且如果动态库发生变化也不需要重新编译可执行程序,升级的时候方便,linux下动态库一般存放在 /lib, /usr/lib 和 /usr/local/lib下,但是程序运行的时候必须提供动态链接库支持。
        linux下创建动态库: -shared
            gcc  -fPIC  -c test1.c (-fPIC产生与位置无关的代码,使得.so文件能被多个程序使用)
            gcc  -fPIC  -c test2.c 
            gcc  -shared  -o libmytest.so  test1.o  test2.o    
            上面三句话创建一个动态库mytest ,也可以用一句命令: gcc -fPIC -shared  -o libmytest.so  test1.c  test2.c
 
3.gcc编译的参数
    -E :预处理  gcc -E test.c -o test.i
    -S:编译 gcc -S test.i  -o test.s 
    -c:汇编 gcc -c test.s  -o test.o      
    -o: 不使用默认命名
    -g: 加入调试信息
    -w:不生成警告信息
    -Wall:生成警告信息
    -Idir:指定头文件目录,在使用#include的时候会首先在这里查找,查找不到再去默认的头文件目录查找 ,默认/usr/include   
    -I:取消前一个参数的功能,一般在 -Idir后面使用 
    -include file :引用其他文件,功能类似于#include<file>
        gcc -test.c -include /home/username/test/test.h
    -Ldir:指定库的搜索路径
    -llibrary:指定编译时使用的库   gcc -lmylib  test.c  使用mylib库编译程序,对应的库文件名为libmylib.so
            lib库名.so  =  库文件名        
            /lib,/usr/lib和/usr/local/lib里的库直接用-l参数就能链接,没在这三个地方时使用-L指定路径。
    
4.多个文件的编译
    多个文件需要编译时一般有两种方式,一是所有源文件一起编译,一是分别编译每个源文件,最后链接。前者需要将程序一次性编译,适合体量小的程序,分别编译的好处是某个文件改变时只需要编译改变的文件,不需要重新编译所有文件。
5.makefile文件
    对于文件很多,一个项目的情况下,可以把编译过程写在一个文件中,执行这个文件就可以一步一步编译,这个文件通常命名为makefile或者Makefile,在linux下make命令会执行名字为makefile或Makefile的文件,也可以使用其他命名如makefileHp,这个时候需要使用make -f  makefileHp命令来指定执行这个文件。
 

c++代码的编译的更多相关文章

  1. C#代码反编译 得到项目可运行源码

    C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...

  2. Snippet Compiler——代码段编译工具

    原文地址:http://www.cnblogs.com/conexpress/archive/2011/07/24/2115308.html 不知道大家在工作中是否遇到过下面的情况:在项目中实现了一段 ...

  3. .NET代码自动编译发布

    .NET代码自动编译发布   因本人一直使用.NET开发,在做项目的时候,每次都要涉及到各个环境的部署问题,手工操作容易出错,并且重复劳动多,所以一直在寻找一个能实现自动化部署的方案. 废话不多讲,先 ...

  4. Maven配置插件跳过测试代码的编译和运行

    Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins< ...

  5. Java代码的编译与反编译那些事儿

    原文:Java代码的编译与反编译那些事儿 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language) ...

  6. Apollo 代码的编译演示

    Apollo 代码的编译演示 官方的文档 -- 运行线下演示 如果你没有车辆及车载硬件, Apollo还提供了一个计算机模拟环境,可用于演示和代码调试. 线下演示需要设置docker的release环 ...

  7. 什么是Java代码的编译与反编译?(转)

    转自:http://java.tedu.cn/ask/203119.html Java代码的编译与反编译 一.什么是编译 1.利用编译程序从源语言编写的源程序产生目标程序的过程. 2.用编译程序产生目 ...

  8. Python代码的编译

    Python代码的编译 Python代码在解释执行之前,是会被编译成.pyc或者.pyo文件的,它们是中间字节码表示的文件,之后Python虚拟机才会去解释执行它们. 1.pyc文件 ======== ...

  9. Sublime Text 3 实现C++代码的编译和运行

    在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...

  10. JAVA,Python代码是编译执行还是解释执行?

    转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641 有人在讨论 Python 代码是编译执行还是解释执行?这 ...

随机推荐

  1. hiboCoder 1041 国庆出游 dfs+思维

    先抽象出一棵以1做为根结点的树.给定了访问序列a[1..m]. 考虑两种特殊情况: 1.访问了某个a[j],但是存在a[i]没有访问且i < j,出现这种情况说明a[j]一定是a[i]的祖先节点 ...

  2. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二

    终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...

  3. 【开源项目】智能电视及电视盒子的控制应用TVRemoteIME的接口说明

    一.APP项目介绍: APP名称:TVRemoteIME 功能说明:安卓智能电视或者安卓盒子的控制应用,可跨屏远程输入.远程遥控(代替遥控器)盒子.盒子应用及文件管理.HTTP/RTMP/MMS网络视 ...

  4. 2015最新Android学习线路图

    Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导.据2011年初数据显示仅正式上市两年的操作系统Android已经跃居全球最受欢迎的 ...

  5. Jpa中设置OneToMany插入报异常解决办法

    在Jpa中如果设置@OneToMany,但使用的时候,如果没有赋值,会报异常出现,这时只需要实例化一个空数组即可, 但类型一定要对应: 实例如下: newField.setxxxxxList(new ...

  6. 用dd实现linux硬盘备份

    一个去年的老本,500G硬盘,空间各种捉急,准备迁移到公司的台式机上,却发现Linux上迁移环境没有Windows下那么方便,只能复制整块硬盘了. 从公司拿了一块1T的硬盘,插入移动硬盘盒(淘宝上搞的 ...

  7. DM6446的Bootloader

    RBL(ARM ROM Boot Loader)在芯片出厂的时候就已经烧写到ROM里了,这不需要大家关心,上电后,RBL会自动从EMIFA EM_CS2 memory space (0x0200 00 ...

  8. apache在window server 2003下的安全配置

    在window server2003下安装apache apache 默认有system权限.所以要先对apache进行降权. 添加用户.我的电脑右击 ->管理->本地用户和组

  9. PL/SQL集合 ----- varrays

    varrays可以再表,记录,对象定义中使用,类似于C中的数组. 1.定义varrays用作PL/SQL程序构造块. declare type integer_varray ) of integer; ...

  10. An internal error occurred during: "Building workspace". java.lang.StackOverflowError

    1 错误描述 2 错误原因 由上述描述可以,MyEclipse可用内存不足,导致堆内存溢出 3 解决办法 修改MyEclipse内存设置 #utf8 (do not remove) #utf8 (do ...