1. gcc -E source_file.c
-E,只执行到预编译。直接输出预编译结果。

2. gcc -S source_file.c 
-S,只执行到源代码到汇编代码的转换,输出汇编代码。

3. gcc -c source_file.c
-c,只执行到编译,输出目标文件。

4. gcc (-E/S/c/) source_file.c -o output_filename
-o, 指定输出文件名,可以配合以上三种标签使用。
-o 参数可以被省略。这种情况下编译器将使用以下默认名称输出:
-E:预编译结果将被输出到标准输出端口(通常是显示器)
-S:生成名为source_file.s的汇编代码
-c:生成名为source_file.o的目标文件。
无标签情况:生成名为a.out的可执行文件。

5. gcc -g source_file.c 
-g,生成供调试用的可执行文件,可以在gdb中运行。由于文件中包含了调试信息因此运行效率很低,且文件也大不少。
这里可以用strip命令重新将文件中debug信息删除。这是会发现生成的文件甚至比正常编译的输出更小了,这是因为strip把原先正常编译中的一些额外信息(如函数名之类)也删除了。用法为 strip a.out

6. gcc -s source_file.c
-s, 直接生成与运用strip同样效果的可执行文件(删除了所有符号信息)。

7. gcc -O source_file.c
-O(大写的字母O),编译器对代码进行自动优化编译,输出效率更高的可执行文件。
-O 后面还可以跟上数字指定优化级别,如:
gcc -O2 source_file.c
数字越大,越加优化。但是通常情况下,自动的东西都不是太聪明,太大的优化级别可能会使生成的文件产生一系列的bug。一般可选择2;3会有一定风险。

8. gcc -Wall source_file.c
-W,在编译中开启一些额外的警告(warning)信息。-Wall,将所有的警告信息全开。

9. gcc source_file.c -L/path/to/lib -lxxx -I/path/to/include
-l, 指定所使用到的函数库,本例中链接器会尝试链接名为libxxx.a的函数库。
-L,指定函数库所在的文件夹,本例中链接器会尝试搜索/path/to/lib文件夹。

-I, 指定头文件所在的文件夹,本例中预编译器会尝试搜索/path/to/include文件夹。

下面我们实际试试用命令行怎么操作。

首先写好测试代码

工程目录

~learn_cmake2/

+src/

|            |--cpp1.cpp

|            |--cpp2.cpp

|            |---main.cpp

+include/

|             |---cpp1.h

|             |---cpp2.h

+build/

+CMakeList

  1. cpp1.h
  1. #include<iostream>
  2. using namespace std;
  3. void print1();
  1. cpp2.h
  1. #include<iostream>
  2. using namespace std;
  3. void print2();
  1. cpp1.cpp
  1. #include"cpp1.h"
  2. void print1()
  3. {
  4. cout<<"this is cpp1"<<endl;
  5. }
  1. cpp2.cpp
  1. #include"cpp2.h"
  2. void print2()
  3. {
  4. cout<<"this is cpp2"<<endl;
  5. }
  1. main.cpp
  2. #include<iostream>
  3. #include"opencv2/highgui/highgui.hpp"
  4. #include"cpp1.h"
  5. #include"cpp2.h"
  6. using namespace std;
  7. using namespace cv;
  8. int main()
  9. {
  10. Mat a=imread("cones.png",0);
  11. print1();
  12. print2();
  13. imshow("cones",a);
  14. cvWaitKey(0);
  15. }

用指令编译:

思路就是分别把除了main函数所在的cpp都编译成目标文件,然后再和maincpp链接


总结:  无论我们采用哪种方式编译,总需要告诉编译器我们要编译哪些cpp,这些cpp用到头文件(路径)在哪里。这些cpp用到的第三方库是什么(库文件名字),库在哪里(库路径),库给我们的接口在哪里(库头头文件路径,我们在写cpp时通过include头文件,用接口调用相应的库实现)

其实现在我们可以写一个shell来管理这些编译指令

~learn_cmake2/

+src/

|            |--cpp1.cpp

|            |--cpp2.cpp

|            |---main.cpp

+include/

|             |---cpp1.h

|             |---cpp2.h

+build/

|             |---build.sh

+CMakeList

---build.sh

  1. cd ..
  2. cd src
  3. g++ -c cpp1.cpp -I'/home/baohua/learnlinux/learn_cmake2/include'
  4. g++ -c cpp2.cpp -I'/home/baohua/learnlinux/learn_cmake2/include'
  5. g++ main.cpp -o output -L/usr/lib  -lopencv_highgui  -lopencv_core cpp1.o cpp2.o -I/home/baohua/learnlinux/learn_cmake2/include -I/usr/local/include
  6. ./output

运行结果:

												

gcc 命令详解的更多相关文章

  1. gcc命令详解

    gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点.目前,GCC可以用来编译C/C++.FORTRAN.JAVA.OBJC. ...

  2. linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  3. linux yum命令详解-转

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  4. 【转】linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  5. yum命令详解

    yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载 ...

  6. 【转发】linux yum命令详解

    linux yum命令详解 yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理, ...

  7. linux yum 命令 详解

    linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...

  8. Linux -Yum 命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  9. linux lsof命令详解

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...

随机推荐

  1. 2018-11-19-win10-uwp-使用-Matrix3DProjection-进行-3d-投影

    title author date CreateTime categories win10 uwp 使用 Matrix3DProjection 进行 3d 投影 lindexi 2018-11-19 ...

  2. 洛谷P4018 Roy&October之取石子 题解 博弈论

    题目链接:https://www.luogu.org/problem/P4018 首先碰到这道题目还是没有思路,于是寻思还是枚举找一找规律. 然后写了一下代码: #include <bits/s ...

  3. ThinkPHP商城实战

    ThinkPHP3.2.3商城实战教程,需要的联系我,QQ:1844912514 千万级php电商秒杀项目实战  ,需要的联系我,QQ:1844912514

  4. Python--day61--ORM介绍及Django使用ORM创建表

    ORM: 使用django的ORM详细步骤:(pymysql操作数据库:) #1,自己动手创建数据库(create database 数据库名字;) #2,在Django项目中(setting.py文 ...

  5. C# GUID ToString

    最近在看到小伙伴直接使用 Guid.ToString ,我告诉他需要使用 Guid.ToString("N") ,为什么需要使用 N ,因为默认的是 D 会出现连字符. Guid ...

  6. [android] eclipse里面的安卓模拟器起不来

    提示信息可能是: The connection to adb is down, and a severe error has occured. 网上看了下,常见原因有两个: 1,系统里面另外有个叫ad ...

  7. jQuery 工具类函数-浏览器信息

    在jQuery中,通过$.browser对象可以获取浏览器的名称和版本信息,如$.browser.chrome为true,表示当前为Chrome浏览器,$.browser.mozilla为true,表 ...

  8. CF1151div2(Round 553)

    CF1151div2(Round 553) 思路题大赛 A 少考虑了一种情况,到死没想到 B 貌似我随机化50000次,没找到就无解貌似也过了 感觉随随便便乱搞+分类讨论都可以过的样子 #includ ...

  9. Vue的数据双向绑定和Object.defineProperty()

    Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...

  10. 【2016常州一中夏令营Day4】

    小 W 走迷宫[问题描述]小 W 被小 M 困在了一个方格矩阵迷宫里,矩阵边界在无穷远处,我们做出如下的假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无 ...