gcc编译器 CFLAGS 标志参数说明
- 格式:doc
- 大小:56.50 KB
- 文档页数:4
CFLAGS[Makefile]
CFLAGS
-Wall:选项可以打印出编译时所有的错误或者警告信息。
这个选项很容易被遗忘,编译的时候,没有错误或者警告提⽰,以为⾃⼰的程序很完美,其实,⾥⾯有可能隐藏着许多陷阱。
变量没有初始化,类型不匹配,或者类型转换错误等警告提⽰需要重点注意,错误就隐藏在这些代码⾥⾯。
没有使⽤的变量也需要注意,去掉⽆⽤的代码,让整个程序显得⼲净⼀点。
下次写Makefile的时候,⼀定加-Wall编译选项。
-O0: Do not optimize. This is the default.
-O1: Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function.
-O2: Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff.
-O3: Optimize yet more.
-Os:Optimize for size.-Os enables all-O2optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.。
xmake从⼊门到精通9:交叉编译详解xmake是⼀个基于Lua的轻量级现代化c/c++的项⽬构建⼯具,主要特点是:语法简单易上⼿,提供更加可读的项⽬维护,实现跨平台⾏为⼀致的构建体验。
除了win, linux, macOS平台,以及android, ios等移动端平台的内建构建⽀持,xmake也⽀持对各种其他⼯具链的交叉编译⽀持,本⽂我们将会详细介绍下如何使⽤xmake进⾏交叉编译。
交叉编译⼯具链简介通常,如果我们需要在当前pc环境编译⽣成其他设备上才能运⾏的⽬标⽂件时候,就需要通过对应的交叉编译⼯具链来编译⽣成它们,⽐如在win/macos上编译linux的程序,或者在linux上编译其他嵌⼊式设备的⽬标⽂件等。
通常的交叉编译⼯具链都是基于gcc/clang的,⼤都具有类似如下的结构:/home/toolchains_sdkdir- bin- arm-linux-armeabi-gcc- arm-linux-armeabi-ld- ...- lib- libxxx.a- include- xxx.h每个⼯具链都有对应的include/lib⽬录,⽤于放置⼀些系统库和头⽂件,例如libc, stdc++等,⽽bin⽬录下放置的就是编译⼯具链⼀系列⼯具。
例如:arm-linux-armeabi-ararm-linux-armeabi-asarm-linux-armeabi-c++arm-linux-armeabi-cpparm-linux-armeabi-g++arm-linux-armeabi-gccarm-linux-armeabi-ldarm-linux-armeabi-nmarm-linux-armeabi-strip其中arm-linux-armeabi-前缀就是cross,通过⽤来标⽰⽬标平台和架构,主要⽤于跟主机⾃⾝的gcc/clang进⾏区分。
⾥⾯的gcc/g++就是c/c++的编译器,通常也可以作为链接器使⽤,链接的时候内部会去调⽤ld来链接,并且⾃动追加⼀些c++库。
交叉编译makefile编写交叉编译Makefile编写在软件开发中,我们通常会遇到需要在不同平台上编译程序的情况。
当我们需要在一台主机上编译运行另一种架构的程序时,就需要进行交叉编译。
而Makefile作为一种构建工具,可以帮助我们自动化编译过程,提高开发效率。
本文将介绍如何编写适用于交叉编译的Makefile,以实现在不同平台上的程序构建。
一、了解交叉编译概念交叉编译是指在一台主机上编译生成另一种架构的可执行文件。
通常情况下,我们在本机上编写并编译程序,然后在本机上运行。
但是,当我们需要在不同的平台上运行程序时,由于不同平台的指令集、库文件等差异,我们就需要使用交叉编译来生成适用于目标平台的可执行文件。
二、Makefile的基本结构Makefile是一种用于描述程序构建过程的文件,它包含了一系列规则(rules),每个规则由一个或多个目标(target)和依赖项(dependencies)组成。
当某个目标的依赖项发生变化时,Make工具会根据规则自动更新目标文件。
一个基本的Makefile结构如下所示:```target: dependenciescommand```其中,target表示目标文件,dependencies表示目标文件的依赖项,command表示生成目标文件的命令。
三、交叉编译的Makefile编写在编写交叉编译的Makefile之前,我们需要了解目标平台的相关信息,如架构、编译器、库文件等。
以ARM架构为例,我们可以使用arm-linux-gnueabi-gcc作为交叉编译器。
我们需要定义一些变量,用于指定交叉编译工具链和相关参数:```CC = arm-linux-gnueabi-gccCFLAGS = -Wall -O2```其中,CC表示编译器,CFLAGS表示编译参数。
接下来,我们可以定义目标文件和依赖项:```TARGET = myprogramSRCS = main.c foo.c bar.cOBJS = $(SRCS:.c=.o)```其中,TARGET表示目标文件,SRCS表示源文件列表,OBJS表示目标文件列表。
CFLAGS 详解CFLAGS 是决定Gentoo 系统效能与稳定的关键之一。
恰当的CFLAGS 能在效能、编译时间、与系统稳定度中取得平衡,失败的CFLAGS 可能导致编译失败,甚至系统损毁。
那么,在茫茫CFLAGS 海中,如何才能捞到命中注定那根针呢?此文件的CFLAGS 针对x86 与x86-64 平台上的GCC 3.4 (GNU Compiler Collections - /) 为主,若您使用其它编译器(如icc、compaq c compiler) 或其它平台(如PowerPC、Alpha),本章可能50% 以上的东西您都用不上。
各位请先参考笔者从网络上整理出,有关服务器与工作站需求的信息。
当然,服务器或桌面的需求绝对不只这些,这里仅列出跟设计CFLAGS 比较有关的项目。
以下是整理出的列表:1. 服务器系统:长时间启动(一天24 小时,一年365 天,全年无休)非常稳定(uptime 在99.999% [注] 以上)高安全性(别怀疑,CFLAGS 跟安全性也有很大的关系)在长时间启动的前提下,能自己照顾自己。
效能不是第一考虑互动反应不用很快,够用就好。
2. 桌面、工作站:启动时间没有那么长(使用者要用的时候才开机)可以不用那么稳定(多半有使用者直接在处理,uptime 可以降到99.99% 或更低)效能也是考虑重点互动反应快(如加载一页网页,与其让他在三秒时整面显示出来,不如让它每秒显示一点可是在四秒时才全部显示完毕。
)所以,得到了桌面系统的CFLAGS 设计要点:1. 程序启动时间短2. 反应速度快3. 效能高4. 稳定可以稍差(容许范围内)减少执行档的大小,可以同时减少了内存用量,也节省了一些磁盘空间。
同时,桌面系统最大的效能瓶颈就在磁盘驱动器,减少档案大小也间接降低了磁盘的存取次数,可以加速程序的启动,提升第一次执行的反应速度。
CFLAGS 选项再来,让我们看看gcc 中关键的几个选项。
GCC编译选项参数1. -o,指定输出文件的名称。
例如,gcc -o output main.c将生成一个名为output的可执行文件。
2.-c,只编译源文件但不链接生成可执行文件。
这个选项可以用于分离编译,将源代码和编译后的目标文件分开存放。
3.-g,生成包含调试信息的可执行文件。
这个选项可用于在程序出错时进行调试。
4. -Wall,显示所有警告信息。
这个选项用于尽可能多地检测潜在的错误。
5. -Werror,将警告视为错误。
这个选项会将所有警告信息转化为编译错误,编译过程中如果遇到任何警告就会停止编译。
6. -std,指定所使用的C或C++的标准版本。
例如,-std=c99指定使用C99标准。
7.-I,指定额外的头文件路径。
可以通过多次使用该选项来指定多个路径。
8.-L,指定额外的库文件路径。
可以通过多次使用该选项来指定多个路径。
9. -l,指定要链接的库文件。
例如,-lmath将链接数学库。
10.-O,指定优化级别。
有多个优化级别可选,从-O0(不进行任何优化)到-O3(进行最高级别的优化)。
11.-D,定义预处理宏。
可以使用-D定义宏并为其指定值。
例如,-DDEBUG定义一个名为DEBUG的宏。
12.-U,取消预定义宏的定义。
可以使用-U取消已定义的宏。
13.-E,只进行预处理,生成预处理后的源代码。
可以通过这个选项将预处理后的代码输出到标准输出或另一个文件中。
14.-S,只进行编译,生成汇编代码。
可以通过这个选项将汇编代码输出到标准输出或另一个文件中。
15. -shared,生成共享库文件。
这个选项可以用于生成可供其他程序调用的动态链接库。
16.-fPIC,生成位置无关的代码。
这个选项可以用于在共享库中使用。
17. -pthread,为多线程程序链接额外的线程库。
18. -march,指定目标处理器的架构。
例如,-march=armv7指定目标处理器是ARMv7架构。
19. -mfpu,指定使用的浮点单元类型。
vscode c和汇编混合编译1. 简介在软件开发过程中,我们经常需要使用多种编程语言来实现复杂的功能。
在某些情况下,我们可能需要将C语言和汇编语言混合编译,以充分利用汇编语言的高效性能和C语言的便捷性。
本文将介绍如何在VSCode中进行C和汇编混合编译的步骤和技巧。
2. 准备工作在开始混合编译之前,我们需要准备一些工具和环境:•VSCode:这是一个强大的开源代码编辑器,支持多种编程语言和插件扩展。
•C编译器:在Windows系统上,我们可以使用MinGW或者MSVC作为C语言的编译器;在Linux系统上,我们可以使用GCC。
•汇编编译器:通常情况下,C语言的编译器会集成汇编编译器。
在Windows 系统上,我们可以使用NASM或者MASM;在Linux系统上,我们可以使用GCC。
•Make工具:Make是一个用于自动化编译的工具,可以根据源文件的依赖关系自动编译生成目标文件。
确保以上工具和环境已经正确安装并配置好。
3. 创建项目首先,我们需要在VSCode中创建一个工作目录来存放我们的项目文件。
打开VSCode,点击菜单栏中的“文件”->“打开文件夹”,选择一个合适的位置来创建工作目录。
在工作目录中,我们需要创建以下文件:•main.c:C语言源文件,包含我们的主要代码。
•asm.asm:汇编语言源文件,用于实现一些高效的底层操作。
•Makefile:用于自动化编译的Makefile文件。
4. 编写C代码在main.c文件中,我们可以编写C语言的代码。
下面是一个简单的示例:#include <stdio.h>extern void asm_func();int main() {printf("Hello, World!\n");asm_func();return 0;}在这段代码中,我们通过extern关键字引入了一个名为asm_func的外部函数。
这个函数在后面的汇编语言源文件中实现。
LOCAL_CFLAGS参数说明
1、-Wall
是打开警告开关
2、-O
代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3⾼级优化,-Os代码空间优化
3、-g
是⽣成调试信息,⽣成的可执⾏⽂件具有和源代码关联的可调试的信息
4、-fopenmp
OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被⼴泛接受的,⽤于共享内存并⾏系统的多处理器程序设计的⼀套指导性的编译处理⽅案(Compiler Directive)。
OpenMP⽀持的编程语⾔包括C语⾔、C++和Fortran;⽽⽀持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。
OpenMp提供了对并⾏算法的⾼层的抽象描述,程序员通过在源代码中加⼊专⽤的pragma来指明⾃⼰的意图,由此编译器可以⾃动将程序进⾏并⾏化,并在必要之处加⼊同步互斥以及通信。
当选择忽略这些pragma,或者编译器不⽀持OpenMp时,程序⼜可退化为通常的程序(⼀般为串⾏),代码仍然可以正常运作,只是不能利⽤多线程来加速程序执⾏。
5、-D
增加全局宏定义
6、-ffast-math
浮点优化选项 -ffast-math:极⼤地提⾼浮点运算速度
7、-mfloat-abi=softfp 浮点运算。
gcc与clang编译参数
gcc 和 clang 是两种常用的 C/C++ 编译器,它们都支持一系
列的编译参数来控制编译过程。
下面我将从多个角度介绍它们的编
译参数。
首先,编译参数可以分为常用参数、优化参数和调试参数。
常
用参数包括控制编译过程的参数,例如指定输出文件名的参数 `-o`,指定头文件搜索路径的参数 `-I`,指定库文件搜索路径的参数 `-
L` 等。
优化参数用于控制编译器的优化行为,例如 `-O1`、`-O2`、`-O3` 分别表示不同级别的优化。
调试参数用于生成调试信息,例
如 `-g` 参数可以生成调试信息,方便调试程序。
其次,gcc 和 clang 在一些编译参数的命名上略有不同。
例如,gcc 使用 `-std` 参数来指定 C/C++ 标准的版本,而 clang 使用
`-std` 参数来指定 C++ 标准的版本,指定 C 标准的版本则使用
`-std=c` 参数。
另外,对于一些特定的优化参数,两者也有一些差异。
此外,gcc 和 clang 在一些特性支持上也有所不同,导致在编
译参数上会有一些差异。
例如,对于 OpenMP 并行编程的支持,gcc
使用 `-fopenmp` 参数,而 clang 使用 `-fopenmp=libomp` 参数。
总的来说,gcc 和 clang 的编译参数有很多共同之处,但也存
在一些细微的差异。
在使用编译参数时,需要根据具体的编译器和
编译需求来选择合适的参数。
同时,建议查阅官方文档以获取最准
确和最新的信息。
cflags 参数CFLAGS参数是在编译C语言程序时使用的参数,它用于指定编译器的选项和标志,以对程序进行优化或进行其他特定的操作。
本文将介绍CFLAGS参数的常见用法和作用。
一、CFLAGS参数的基本概念和作用CFLAGS参数是GCC编译器的一个选项,用于指定编译器的标志和选项。
通过使用CFLAGS参数,我们可以在编译C语言程序时指定一些特定的选项,以对程序进行优化或进行其他操作。
CFLAGS参数可以用于指定编译器的优化级别、警告级别、调试信息等。
二、CFLAGS参数的常见用法1. 指定优化级别优化级别用于指定编译器对程序进行优化的程度。
常见的优化级别包括-O0、-O1、-O2和-O3。
其中,-O0表示不进行优化,-O1表示进行基本的优化,-O2表示进行更多的优化,-O3表示进行最大程度的优化。
通过在CFLAGS参数中指定相应的优化级别,可以根据需求选择合适的优化程度。
2. 指定警告级别警告级别用于指定编译器产生警告信息的程度。
常见的警告级别包括-Wall、-Werror和-Wextra。
其中,-Wall表示生成所有常见的警告信息,-Werror表示将警告信息作为错误处理,-Wextra表示生成更多的警告信息。
通过在CFLAGS参数中指定相应的警告级别,可以帮助开发者发现潜在的问题,并改善代码质量。
3. 指定调试信息调试信息用于在程序运行过程中进行调试。
常见的调试信息选项包括-g、-ggdb和-g3。
其中,-g表示生成基本的调试信息,-ggdb 表示生成供GDB调试器使用的调试信息,-g3表示生成更详细的调试信息。
通过在CFLAGS参数中指定相应的调试信息选项,可以方便地进行程序的调试工作。
4. 其他选项除了上述常见的用法外,CFLAGS参数还可以用于指定其他一些选项,如指定include路径、定义宏等。
通过在CFLAGS参数中添加相应的选项,可以灵活地控制编译过程。
三、CFLAGS参数的使用示例下面是一些使用CFLAGS参数的示例:1. 指定优化级别为-O2和警告级别为-Wall:CFLAGS=-O2 -Wall2. 指定调试信息为-g和优化级别为-O1:CFLAGS=-g -O13. 指定调试信息为-ggdb和警告级别为-Werror:CFLAGS=-ggdb -Werror4. 指定include路径为/usr/include和定义宏DEBUG:CFLAGS=-I/usr/include -DDEBUG通过在Makefile或命令行中使用上述示例中的CFLAGS参数,可以根据具体需求对C语言程序进行编译。
gcc编译器 CFLAGS 标志参数说明2012-11-14 15:10:28
分类:LINUX
CFLAGS = -g -O2 -Wall -Werror -Wno-unused
编译出现警告性错误unused-but-set-variable,变量定义但没有使用,解决方法:
增加CFLAGS 或CPPFLAGS参数如下:
CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1
Gcc总体选项列表
后缀名所对应的语言
-S只是编译不汇编,生成汇编代码
-E只进行预编译,不做其他处理
-g在可执行程序中包含标准调试信息
-o file把输出文件输出到file里
-v打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir在头文件的搜索路径列表中添加dir目录
-L dir在库文件的搜索路径列表中添加dir目录
-static链接静态库
-llibrary连接名为library的库文件
·“-I dir”
正如上表中所述,“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。
由于Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,Gcc就会到相应的位置查找对应的目录。
比如在“/root/workplace/Gcc”下有两个文件:
#include
int main()
{
printf(“Hello!!\n”);
return 0;
}
#include
这样,就可在Gcc命令行中加入“-I”选项:
[root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1
这样,Gcc就能够执行出正确结果。
小知识
在include语句中,“<>”表示在标准路径中搜索头文件,““””
表示在本目录中搜索。
故在上例中,可把hello1.c的“#include”
改为“#include “my.h””,就不需要加上“-I”选项了。
·“-L dir”
选项“-L dir”的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。
例如有程序hello_sq.c需要用到目录“/root/workplace/Gcc/lib”下的一个动态库
libsunq.so,则只需键入如下命令即可:
[root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o
hello_sq
需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在
路径中包含文件名。
另外值得详细解释一下的是“-l”选项,它指示Gcc去连接库文件libsunq.so。
由于在Linux
下的库文件命名时有一个规定:必须以lib三个字母开头。
因此在用-l选项指定链接的库
文件名时可以省去lib三个字母。
也就是说Gcc在对”-lsunq”进行处理时,会自动去链接
名为 libsunq.so的文件。
(2)告警和出错选项
Gcc的告警和出错选项如表3.8所示。
Gcc总体选项列表
选项含义
-ansi 支持符合ANSI标准的C程序
-pedantic 允许发出ANSI C标准所列的全部警告信息
-pedantic-error 允许发出ANSI C标准所列的全部错误信息
-w 关闭所有告警
-Wall 允许发出Gcc提供的所有有用的报警信息
-werror 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
下面结合实例对这几个告警和出错选项进行简单的讲解。
如有以下程序段:
#include
void main()
{
long long tmp = 1;
printf(“This is a bad code!\n”);
return 0;
}
这是一个很糟糕的程序,读者可以考虑一下有哪些问题?
·“-ansi”
该选项强制Gcc生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI C标准的。
运行结果如下所示:
[root@localhost Gcc]# Gcc –ansi warning.c –o warning
warning.c: 在函数“main”中:
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
可以看出,该选项并没有发现”long long”这个无效数据类型的错误。
·“-pedantic”
允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。
其运行结果如下所示:
[root@localhost Gcc]# Gcc –pedantic warning.c –o warning
warning.c: 在函数“main”中:
warning.c:5 警告:ISO C90不支持“long long”
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。
·“-Wall”
允许发出Gcc能够提供的所有有用的报警信息。
该选项的运行结果如下所示:
[root@localhost Gcc]# Gcc –Wall warning.c –o warning
warning.c:4 警告:“main”的返回类型不是“int”
warning.c: 在函数”main”中:
warning.c:7 警告:在无返回值的函数中,”return”带返回值
warning.c:5 警告:未使用的变量“tmp”
使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。
另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。
(3)优化选项
Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。
对于不同版本的Gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。
不同的优化级别对应不同的优化处理工作。
如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。
使用优化选项“-O2”除了完成所有
“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。
选项
“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。
虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。
因为代码
在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突
然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来
讲都将是一场噩梦。
所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在
最终发行的时候才考虑对其进行优化。
(4)体系结构相关选项
Gcc的体系结构相关选项如表3.9所示。
Gcc体系结构相关选项列表
选项含义
-mcpu=type 针对不同的CPU使用相应的CPU指令。
可选择的type有i386、i486、pent -mieee-fp 使用IEEE标准进行浮点数的比较
-mno-ieee-fp 不使用IEEE标准进行浮点数的比较
-msoft-float 输出包含浮点库调用的目标代码
-mshort 把int类型作为16位处理,相当于short int
-mrtd 强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令。