cc foobar.c
  就会把 foobar.c 通过以上的步骤编译出来。如果你有多个文件要编译,只要输入
cc foo.c bar.c
  注意,语法检查就是──纯粹的检查语法。而不会检测你可能犯的任何逻辑错误。比如无限循环,或者是你想用一元排序却使用了冒泡排序。
  cc 有很多选项,在帮助手册中都可以找到。这里列出了一些最重要的选项,并且有例子。
-o filename

输出的文件名。如果你不使用这个选项,cc 为产生 出一个叫 a.out 的执行文件。

cc foobar.c

可执行文件是 a.out
cc -o foobar foobar.c 可执行文件是 foobar
-c

仅仅编译文件,不会连接。如果你只想检查你写的测试程序的语法的话,这个选项非常有用。或者你会使用 Makefile
cc -c foobar.c
这会产生一个 目标文件 (不可执行) 叫做 foobar.o 。这个文件可以和其他的目标文件连接在一起构成一个可执行文件。
-g
产生一个可调试的可执行文件。编译器会在可执行文件中植入一些信息,这些信息能够把源文件中的行数和被调用的函数联系起来。在你一步一步调试程序的时候,调试器能够使用这些信息来显示源代码。这是 非常 有用的;缺点就是被植入的信息让程序变得更大。通常情况下,开 发一个程序的时候我们经常使用 -g ,但是我们在编译一个 “release 版本” 的程序的时候,如果程序工作得让人满意了,我 们就不使用 -g 编译。
cc -g foobar.c
这会产生一个可调试版本的程序。
-O
产生一个优化版本的可执行文件。编译器会使用一些聪明的技巧产生出比普通编译产生的文件执行更快的可执行文件。可以在 -O 加上数字来使用更高级的优化。但是这样做经常会暴露出编译器的优化器中的一些 错误。例如,2.1.0 版本的 FreeBSD 中的 cc 在某些情况 下使用了 -O2 的话,会产生出错误的代码。
优化通常只在编译一个 release 版本的时候才被打开。
cc -O -o foobar foobar.c

这会产生一个优化版本的 foobar 。

-O和 -O1指定1级优化

-O2 指定2级优化

-O3 指定3级优化

-O0指定不优化

$cc -c O3 -O0 hello.c

当出现多个优化时,以最后一个为准!!

-I

可指定查找include文件的其他位置.例如,如果有些include文件位于比较特殊的地方,比如/usr/local/include,就可以增加此选项如下:

$cc -c -I/usr/local/include -I/opt/include hello.c

此时目录搜索会按给出的次序进行.

-E

这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:
$cc -c -E hello.c >cpp.out

此命令使include文件和程序被预先处理并重定向到文件cpp.out.以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.

-M

自动找寻源文件中包含的头文件,并生成一个依赖关系.于是由编译器自动生成的依赖关系,这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。

-D

允许从编译程序命令行定义宏符号

一共有两种情况:一种是用-DMACRO,相当于在程序中使用#define MACRO,另一种是用-DMACRO=A,相当于程序中的#define MACRO A.如对下面这代码:

#ifdefine DEBUG

printf(“debug message\n”);

#endif

编译时可加上-DDEBUG参数,执行程序则打印出编译信息
下面的三个参数会迫使 cc 检查你的代码是否符合一些国际标准,经常被我们叫做 ANSI 标准,虽然严格的来说它是一个 ISO 标准。

-Wall

打开所有 cc 的作者认为值得注意的警告。不要只看这个选项的名字,它并没有打开所有 cc 能够注意到的所有警告。

-ansi

关闭大多数,但并不是所有,cc 提供的非 ANSI C 特性。不要只看选项的名字,它并不严格保证你的代码会兼容标准。

-pedantic

关闭 所有 cc 的非 ANSI C 特性。

没有这些选项,cc 能允许你按照标准使用一些非标准的扩展。有一些扩展非常有用,但不能与其他编译器兼容──实际上,这个标准的主要目的之一就是允许我们写出可以在任何系统上的由任何编译器编译的代码。这就叫做 可移植代码

通常来说,你应该让你的代码尽可能的可以移植。否则你就不得不完全重写你的代码以便能够在其他地方运行之──而且谁知道几年后你是否还会用它?

%

cc -Wall -ansi -pedantic -o foobar foobar.c

这会在检查 foobar.c 对标准的兼容性以后产生一个 foobar 可执行文件。

-Ldirname

指定连接库的搜索目录,-l(小写L)指定连接库的名字
$gcc main.o -L/usr/lib -lqt -o hello

指定连接库的搜索目录,-l(小写L)指定连接库的名字

上面的命令把目标文件main.o与库qt相连接,连接时会到/usr/lib查找这个库文件.也就是说-L与-l一般要成对出现.

-llibrary

在连接的时候指定一个函数库。

最常见的情况就是当你编译一个使用了一些 C 中的数学函数的时候。不像大多数其他的平台,这些函数都不在 C 的标准库里面。你必须告诉编译器加 上这些库。

这个规则就是,如果库的名字叫做 libsomething .a ,你就必 须给 cc 这样的选项 -lsomething 。例如,数学库 叫做 libm.a ,因此你给 cc 的选 项就是 -lm 。一般情况下,我们要把这个选项放到命令行的 最后。

cc -o foobar foobar.c -lm

这个会把数学函数库连接到 foobar 里面。

如果你要编译 C++ 代码,你需要 -lg++ ,或者 -lstdc++ 如果你使用的是 FreeBSD 2.2 或者更高版本,来 连接 C++ 库。或者,你可以运行 c++ 而不是 cc 来编译 C++ 代码。在 FreeBSD 上, c++ 也可以通过运行 g++ 来唤醒。

cc -o foobar foobar.cc

-lg++ 对于 FreeBSD 2.1.6 或者更低的版本

cc -o foobar foobar.cc -lstdc++

对 FreeBSD 2.2 或者更高的版本

c++ -o foobar foobar.cc
两种情况都会从 C++ 源文件 foobar.cc 产生一个 可执行文件 foobar 。注意,在 UNIX ® 系统中,C++ 源 文件的传统后缀是 .C ,.cxx 或 者 .cc ,而不是 MS-DOS ® 类型的 .cpp (这个后缀已经被用到了其他的地方)。 gcc 根据这个约定来确定应该使用何种类型的编译器来编译源文件。但是,这个限制不再起作用了,因此现在你可以自由的使用 .cpp 这个后缀来命名你的 C++ 源文件!

Linux 中的 cc 命令相关推荐

  1. 2021-05-10 linux中的find命令——查找文件名

    linux中的find命令--查找文件名 1.在某目录下查找名为"elm.cc"的文件 find /home/lijiajia/ -name elm.cc 2.查找文件名中包含某字 ...

  2. linux中su命令源码,Linux中的su命令的详细解释

    linxu下的su命令的主要作用是变更为其他使用者的身份执行命令,面由学习啦小编为大家整理了linux的su命令的详细解释的相关知识,希望对大家有帮助! 一.Linux中的su命令的详细解释 建议大家 ...

  3. Linux 中的 nl 命令详解及C/C++代码实现(文件行数)

    在Linux 操作系统中,如果想编辑文本文件时,希望显示在其前面附加行号的行,这时 Linux 中 nl 命令就派上用场,nl 命令对文件中的行进行编号. Linux nl命令 nl 命令是一个 Un ...

  4. linux mkdir命令用法,linux中的mkdir命令的详细解释

    linxu下的mkdir命令从字面上就可以理解其实是创建文件或者目录的意思.下面由学习啦小编为大家整理了linux的mkdir命令的详细解释的相关知识,希望对大家有帮助! 一.linux中的mkdir ...

  5. Linux中常用的命令都是哪些单词的缩写

    作者:蓬岸 Dr.Quest 链接:https://www.zhihu.com/question/49073893/answer/114986798 来源:知乎 著作权归作者所有.商业转载请联系作者获 ...

  6. linux中touch命令含义,Linux中的touch命令的详细解释

    Linux下的touch命令是用来干嘛的呢?小编告诉你它是修改文件或目录的时间属性,下面由学习啦小编为大家整理了linux下的touch命令的详细解释,希望对大家有帮助! Linux中的touch命令 ...

  7. linux中常见渗透命令

    linux中常见渗透命令 操作系统信息收集 如何查看服务器的版本? cat /etc/issue cat /etc/*-release cat /etc/lsb-release # 基于 Debian ...

  8. Linux中升级更新命令yum upgrade和yum update的区别

    这篇文章主要介绍了Linux中升级更新命令yum upgrade和yum update的区别,Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的,本文 ...

  9. Linux中的In命令

    2019独角兽企业重金招聘Python工程师标准>>> ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用 ...

最新文章

  1. 替换对象所有字段_JVM字段访问优化
  2. button layui 点击事件_Layui 带多选框表格监听事件以及按钮自动点击写法实例
  3. 使用不可变对象创建值对象
  4. 【渝粤教育】国家开放大学2019年春季 1062文学英语赏析 参考试题
  5. OpenGl绘制螺旋线
  6. Ansible AdHoc playbook API + 动态生成Inventory +结果关注
  7. 被除数、除数、商、余数的正负号规律二
  8. javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...
  9. 【matlab】:matlab中不断的出现计算过程怎么办
  10. Rust : Trait Object safe 问题
  11. SQL正则表达式的应用 case的灵活应用
  12. python图片转换成文字_在python中将图像转换为字节文字 - python
  13. 【Linux系列文章】软件包管理
  14. 迎新春,送关怀,送温暖|云畅科技走访慰问三湘社区
  15. 用Java给您的图片瘦身之Thumbnailator技术
  16. 教你一招H5快应用快速回到首页
  17. 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231
  18. 面试题:strcpy考虑内存重叠
  19. dataframe的两列转换成字典的key和value
  20. 《吐血整理》顶级程序员工具集

热门文章

  1. Matlab生成stm32代码
  2. REC_RE时延测量
  3. 智慧产业园区建设破题,秘诀竟是“小程序化”?
  4. 专利与论文-2:什么是专利?专利的几种类型?
  5. SQL Server服务无法启动/登陆的解决方法
  6. 为什么7805前要加达林顿管【转自阿莫论坛】
  7. 学考计算机使用说明,《大学计算机》上机考试系统操作指南
  8. liquibase编写sql脚本
  9. Windows Thin PC体验 语言包更改(win 7 included)
  10. 人脸识别打卡项目(2)