显示行号

|

选择喜欢的代码风格

默认

GitHub

Dune

LakeSide

Plateau

Vibrant

Blue

Eighties

Tranquil

cc 命令运行系统的 C 编译器。这是 GNU 编译器集合 gcc 的符号链接。编译器的基本职责是将计算机程序从一种语言翻译成另一种语言,并且通常在单个编译中不止一次地执行此操作。编译用 C 编写的程序时,编译器会经过几个步骤将其转换为可在目标体系结构或平台上执行的机器代码。

cc 命令安装:

-bash: cc: command not found

#Debian

apt-get install gcc

#Ubuntu

apt-get install gcc

#Alpine

apk add gcc

#Arch Linux

pacman -S gcc

#Kali Linux

apt-get install gcc

#CentOS

yum install gcc

#Fedora

dnf install gcc

#Raspbian

apt-get install gcc

#Docker

docker run cmd.cat/cc cc

cc 命令补充说明:

通常,编译器会对您的代码执行以下功能:

预处理:C 预处理器(“cpp”)通过删除注释,扩展宏以及执行一些其他重要步骤来准备将代码发送到实际编译器。

语法检查:您的程序是否包含任何语法错误?如果是这样,编译器会通知您,您必须在继续操作之前修复它们。如果它怀疑你的程序的某些部分不正确,但它不确定它们实际上是错误,它可能会发出警告,但仍然编译该程序。

转换为汇编语言:这是一个中间步骤,您的代码将被转换为目标系统汇编语言的语言。这几乎是您的代码仍然可供人阅读的最后一步。

Assembly:您的程序被组装成适合您的目标平台的目标代码的位和字节。

链接:目标代码与程序和命令行选项指定的任何库函数的目标代码链接在一起,并创建可执行文件。

cc 命令语法:

cc [ options ]

cc 命令选项:

您可以将数百个选项传递给编译器,以微调程序的执行方式。 在这里,我们选择了一些最有用和最常用的选项,您可能需要这些选项来创建可执行文件。

-c 只需编译代码; 不要尝试链接源文件。 将创建对象文件,可以选择稍后在单独的步骤中链接以创建可执行文件。

-O[level] 创建优化的可执行文件 编译器将分析您的代码,如果它知道任何加速性能的聪明技巧,它将在字节代码中实现它们。 级别是可选的数字,字母或单词,可指定应进行多少优化。

例如,GNU编译器集合允许选项-O0指定最小优化(默认),-O1和-O2用于中间优化级别,-O3用于最大化优化。 -Ofast可用作-O3的别名,-Og将执行与调试器稍后分析兼容的优化。

优化需要更多的计算和内存,并且需要更长的时间才能完成。

x86系统的常见优化技巧包括减少指令大小以降低执行成本,为零值实现专用寄存器(因为在大多数程序中通常使用零),并通过利用优化某些乘法和数组索引缩放操作 LEA(“加载有效地址”)指令。

-Wall 编译时启用“all”(除了最深奥的所有)警告。 这是定期使用的一个很好的选择,因为它可以提示您任何可能不是错误的条件,但您可能仍然希望在编译之前解决。

-ansi 禁用cc提供的大多数(但不是全部)非ANSI C兼容功能。 要遵守严格的ANSI标准,请启用此选项。 这样做可确保您的代码完全可移植,以便在任何其他系统上进行编译。

-g 创建已编译的可执行文件的调试版本。 编译器将在编译的可执行文件中包含关于哪个源文件对应于哪个函数调用的信息。 调试器稍后可以使用此信息在您单步执行程序时显示源代码。 请注意,这会创建一个更大的可执行文件。

-D name[=value] 通过将指定值分配给符号名称,在编译时定义宏。 运行C预处理器时,它会将 name 的任何实例扩展为 value 文本。

-Idir 在搜索常用目录之前,搜索名称不以斜杠(/)开头的包含文件。 将按指定的顺序搜索多个-I选项的目录。 预处理器首先在包含 sourcefile 的目录中搜索 #include 文件,然后在使用 -I options(如果有)命名的目录中搜索 /usr/ucbinclude,最后在 /usr/include 中搜索 .include 文件。

-Ldir 将dir添加到编译器将查找链接库的目录列表中。 此选项传递给 ld 和 /usr/lib。

-llibrary 如果链接,此选项会将指示的库添加到要链接的库列表中。 例如,如果您正在使用C数学库(libm)中的函数,则可以使用选项-lm在编译时链接它。

请注意库的相互依赖关系,并确保在命令行上以正确的顺序链接它们; 首先指定其他库将依赖的任何库。 例如,“-lGL -lGLU”将首先搜索libGL,然后搜索libGLU。

libGLU依赖于libGL,因此如果颠倒了这些-l选项的顺序,程序将无法编译。

-M 如果链接,则创建一个与输出可执行文件具有相同基本名称的映射文件,但带有后缀.map。 此映射文件包含带有其地址的符号列表。

-mmodel 指定编译器和链接器使用的内存模型。 模型的值包括“小”存储器模型的s,m代表“中”,l代表“大”,f代表“平坦”(32位),c代表“紧凑”,或h代表“巨大”。 除非您确定需要此选项,否则可以省略它。

-o file name 已编译的可执行文件的输出名称。 如果未指定文件名,则编译的可执行文件将命名为a.out。

-S 生成汇编程序源代码,但在实际汇编之前停止。

-Uname “Undefine”任何以前定义的宏命名名称,可以在源代码中使用-D在命令行中指定。

cc 命令实例

#编译文件myfile.c。 输出将写入可执行文件a.out。

cc myfile.c

#编译文件myfile.c并命名编译的可执行输出文件myexe。

cc myfile.c -o myexe

#编译文件myfile.c并将编译后的可执行文件输出为myexe,如果出现则在编译期间显示警告。

cc myfile.c -Wall -o myexe

#将myfile.c编译为可执行的myexe,链接libX11库并在编译期间发出任何适用的警告。

cc myfile.c -Wall -lX11 -o myexe

#将myfile.c编译为可执行的myexe,链接libX11库,严格遵守ANSI C标准,并在适用时发出警告。

cc myfile.c -Wall -ansi -lX11 -o myexe

cc 命令扩展阅读:

cc 命令评论

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐