gcc编译器 CFLAGS 标志参数说明
CFLAGS[Makefile]
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从⼊门到精通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的基本结构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 详解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编译选项参数
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,指定使用的浮点单元类型。
CFLAGS
-D*表示:#define * -Wall 表示打开所有编译告警信息 -O2表示优化级别。 -Wl,-rpath,./为传递给连接器的选项,表示程序执行时的库加载路径
Gcc总体选项列表
后缀名 -S -E -g -o file -v -I dir -L dir -static -llibrary
Gcc总体选项列表
选项 -ansi -pedantic -pedantic-error -w -Wall -werror
Gcc总体选项列表
选项 -mcpu=type -mieee-fp -mno-ieee-fp -msoft-float -mshort -mrtd
如:-DPOS所对应的语言 只是编译不汇编,生成汇编代码 只进行预编译,不做其他处理 在可执行程序中包含标准调试信息 把输出文件输出到file里 打印出编译器内部编译各过程的命令行信息和编译器的版本 在头文件的搜索路径列表中添加dir目录 在库文件的搜索路径列表中添加dir目录 链接静态库 连接名为library的库文件
含义 支持符合ANSI标准的C程序 允许发出ANSI C标准所列的全部警告信息 允许发出ANSI C标准所列的全部错误信息 关闭所有告警 允许发出Gcc提供的所有有用的报警信息 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程
含义 针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、 pentium及i686等 使用IEEE标准进行浮点数的比较 不使用IEEE标准进行浮点数的比较 输出包含浮点库调用的目标代码 把int类型作为16位处理,相当于short int 强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令
vscode c和汇编混合编译
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参数说明
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编译参数
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 参数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语言程序进行编译。
makefile文件中ldflags参数的用法
makefile文件中ldflags参数的用法概述在编写m ak ef il e文件时,我们可以使用不同的参数来设置编译器和链接器的选项。
其中,`ld fl ag s`参数是一个非常重要的选项,用于指定链接器(Li nk er)的参数和选项。
本文将介绍如何正确地使用`l df la gs`参数,以及其中的常见用法和示例。
ldfla gs参数的基本语法在m ak ef il e文件中,使用`ld fl ag s`参数的基本语法如下:l d fl ag s:=<fl ag s>其中,`<f la gs>`代表一系列链接器的参数和选项,多个参数之间使用空格分隔。
常见用法1.指定库文件路径在进行链接时,有时需要指定外部库文件的路径。
我们可以使用`-L`选项来指定库文件所在的路径。
下面是一个示例:l d fl ag s:=-L/pa th/t o/li b本示例中,`/p at h/t o/l ib`是库文件所在的路径。
2.指定库文件除了指定库文件路径,我们还可以使用`-l`选项来明确指定需要链接的库文件。
下面是一个示例:l d fl ag s:=-lm yl ib本示例中,`my li b`是需要链接的库文件名。
3.指定静态链接库如果需要链接静态库文件,可以使用`-st a ti c`选项。
下面是一个示例:l d fl ag s:=-st at ic本示例中,使用了`-s ta ti c`选项来指示链接器链接静态库。
4.指定动态链接库如果需要链接动态库文件,可以使用`-sh a re d`选项。
下面是一个示例:l d fl ag s:=-sh ar ed本示例中,使用了`-s ha re d`选项来指示链接器链接动态库。
5.指定其他链接器选项除了上述常见用法外,还可以使用`l df la g s`参数指定其他链接器选项。
例如,可以使用`-O`选项指定优化级别,使用`-n os tar t fi le s`选项禁止使用系统默认启动文件等。
GCC常用参数详解
GCC常⽤参数详解简介gcc and g++现在是gnu中最主要和最流⾏的c & c++编译器 .gcc/g++在执⾏编译⼯作的时候,总共需要以下⼏步:1.预处理,⽣成.i的⽂件[预处理器cpp]2.将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs]3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]4.连接⽬标代码,⽣成可执⾏程序[链接器ld]GCC能够处理的后缀有:a. *.c *.C (C语⾔)b. *.cxx *.cc (C++语⾔)c. *.m (⾯向对象的C)d. *.i (预处理后的C语⾔源⽂件)e. *.ii (预处理后的C++语⾔源⽂件)f. *.s *.S (汇编语⾔)h. *.h (头⽂件)⽬标⽂件可以是:a. *.o 编译连接后的⽬标⽂件b. *.a 库⽂件gcc与g++有什么区别?gcc和g++都是GNU(组织)的⼀个编译器。
误区⼀:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,⽽g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
C++的语法规则更加严谨⼀些。
2.编译阶段,g++会调⽤gcc,对于c++代码,两者是等价的,但是因为gcc命令不能⾃动和C++程序使⽤的库联接,所以通常⽤g++来完成链接,为了统⼀起见,⼲脆编译/链接统统⽤g++了,这就给⼈⼀种错觉,好像cpp程序只能⽤g++似的。
误区⼆:gcc不会定义__cplusplus宏,⽽g++会实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采⽤gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:编译只能⽤gcc,链接只能⽤g++严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以⽤gcc/g++,⽽链接可以⽤g++或者gcc -lstdc++。
GCC编译选项参数
GCC编译选项参数GCC是一种开源的编译器套件,可用于编译多种编程语言,例如C、C++、Objective-C、Fortran等。
GCC提供了许多编译选项参数,以便开发人员根据需要自定义编译过程。
以下是一些常用的GCC编译选项参数。
1. -o filename:指定输出文件的名称,例如gcc -o myprogram.c。
2.-c:仅编译源文件,生成相应的目标文件,而不进行链接操作。
3.-E:仅进行预处理,输出预处理后的源代码。
4.-S:仅进行编译,生成汇编语言代码。
5.-g:生成调试信息,以便在调试程序时使用调试器。
6. -O[level]:优化编译,提高程序执行效率。
级别有-O0(关闭优化)、-O1(开启基本优化)、-O2(开启更多优化)、-O3(开启所有优化)等。
7. -Wall:输出所有警告信息。
8. -Werror:将所有警告信息视为错误,编译过程中出现警告将中断编译。
9. -std=标准:指定使用的语言标准,例如-std=c9910. -I directory:指定头文件的路径,可以使用多个-I选项来指定多个路径。
11. -L directory:指定库文件的路径,可以使用多个-L选项来指定多个路径。
12. -l library:链接指定的库文件,例如-lm表示链接数学库。
13. -D macro:定义一个宏,可以使用-D选项定义多个宏。
14. -U macro:取消一个宏的定义。
15. -pedantic:严格按照标准执行,当代码使用了标准不允许的特性时给出警告。
16. -Werror-implicit-function-declaration:函数未声明时,将其视为错误。
17. -Wno-unused-variable:忽略未使用的变量警告。
18.-fPIC:生成位置无关代码,用于生成共享库。
19. -march=architecture:指定目标架构,例如-march=native表示使用当前机器的最佳指令集扩展。
makefile文件中ldflags参数的用法
makefile文件中ldflags参数的用法在Makefile文件中,`LDFLAGS`是一个用于传递链接器选项的变量。
它用于指定链接时所需的库文件、库路径和其他链接器选项。
`LDFLAGS`变量的用法如下:1. 指定库文件:LDFLAGS = -l<library_name>例如,要链接`libfoo.so`库文件,可以使用`LDFLAGS = -lfoo`。
2. 指定库路径:LDFLAGS = -L<path_to_library>例如,要指定`/usr/local/lib`作为库文件的路径,可以使用`LDFLAGS = -L/usr/local/lib`。
3. 指定多个库文件和库路径:LDFLAGS = -l<library_name1> -l<library_name2> -L<path_to_library1> -L<path_to_library2>例如,要链接`libfoo.so`和`libbar.so`两个库文件,并指定`/usr/local/lib`和`/usr/lib`作为库路径,可以使用`LDFLAGS = -lfoo -lbar -L/usr/local/lib -L/usr/lib`。
4. 指定其他链接器选项:LDFLAGS = <linker_option1> <linker_option2>例如,要指定链接器标志`-static`,可以使用`LDFLAGS = -static`。
需要注意的是,`LDFLAGS`变量的值会被传递给链接器来进行链接操作。
在Makefile文件中,链接器通常使用`$(LDFLAGS)`来引用`LDFLAGS`变量的值。
例如:$(CC) $(LDFLAGS) -o output_file input_file1input_file2其中,`$(CC)`表示C编译器,`-o output_file`指定输出文件名,`input_file1 input_file2`表示输入文件。
cmakelist gcc参数
cmakelist gcc参数摘要:1.介绍cmake 和gcc2.列举常用的gcc 参数3.解释如何使用cmake 和gcc 参数进行编译4.总结正文:cmake 是一个跨平台的构建系统,它可以帮助开发者构建不同操作系统和架构的软件。
gcc,全称GNU Compiler Collection,是一个开源的编译器套件,支持多种编程语言,如C、C++、Objective-C 和Fortran 等。
在实际软件开发过程中,开发者通常会用到cmake 和gcc 这两个工具。
在cmake 中,我们可以通过设置参数来控制编译过程。
这些参数可以影响到编译后的软件性能、可移植性等方面。
常用的gcc 参数有以下几个:1.-O:优化编译,产生更高效的可执行文件。
这个参数通常与-O2 或-O3 一起使用,以选择不同程度的优化。
2.-O2:中等优化。
这个选项会开启一些较为简单的优化措施,如循环展开、常量折叠等。
3.-O3:高级优化。
这个选项会开启更多的优化措施,但可能导致代码可读性降低。
4.-Warnings-as-errors:将编译器警告视为错误,提高编译的严格程度。
5.-std=c++11(或其他标准):指定编译时使用的C++标准。
6.-shared:生成共享库。
这个参数可以让编译后的库文件在其他程序中被共享使用。
7.-static:生成静态库。
这个参数可以让编译后的库文件只被当前程序使用,不会影响到其他程序。
了解了这些常用的gcc 参数后,如何在cmake 中使用它们呢?在cmake 的CMakeLists.txt 文件中,我们可以通过以下方式设置gcc 参数:```cmakecmake_minimum_required(VERSION 3.10) # 设定cmake 最低版本要求project(MyProject) # 定义项目名称set(CMAKE_CXX_STANDARD 11) # 设置C++标准为C++11set(CMAKE_CXX_STANDARD_REQUIRED True) # 使C++标准设置为必需add_executable(MyProject main.cpp) # 添加可执行文件目标,以及需要编译的源文件target_link_libraries(MyProject PRIVATE MyLibrary) # 为可执行文件链接共享库```在上述示例中,我们首先设定了cmake 的版本要求和项目名称。
Makefile选项CFLAGS、LDFLAGS、LIBS
Makefile选项CFLAGS、LDFLAGS、LIBSCFLAGS 表⽰⽤于C编译器的选项CXXFLAGS 表⽰⽤于C++编译器的选项这两个变量实际上涵盖了编译和汇编的两个步骤CFLAGS:指定头⽂件(.h)的路径,如:CFLAGS=-I/usr/include -I/path/include 。
相同地,安装⼀个包时会在安装路径下建⽴⼀个include⽂件夹,当安装过程中出现故障时,试着把曾经安装的包的include⽂件夹增加到该变量中来。
LDFLAGS:gcc 等编译器会⽤到的⼀些优化參数,也能够在⾥⾯指定库⽂件的位置。
使⽤⽅法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。
每安装⼀个包都差点⼉⼀定的会在安装⽂件夹⾥建⽴⼀个lib⽂件夹。
假设明明安装了某个包,⽽安装还有⼀个包时,它愣是说找不到,能够抒那个包的lib路径增加的LDFALGS中试⼀下。
LIBS:告诉链接器要链接哪些库⽂件。
如LIBS = -lpthread -liconv简单地说,LDFLAGS是告诉链接器从哪⾥寻找库⽂件,⽽LIBS是告诉链接器要链接哪些库⽂件。
有时候LDFLAGS指定-L尽管能让链接器找到库进⾏链接。
可是运⾏时链接器却找不到这个库。
假设要让软件运⾏时库⽂件的路径也得到扩展,那么我们须要增加这两个库给”-Wl,R”:LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib假设在运⾏./configure曾经环境变量设置export LDFLAGS=”-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib” ,注意环境变量设置等号两边不能够有空格,并且要加上引號(shell的使⽤⽅法)。
那么运⾏configure以后。
gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明参考:《GNU gcc嵌入式系统开发作者:董文军》(一) gcc的基本用法(二) 警告提示功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项(一) gcc的基本用法使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。
不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。
如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。
因为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不一样。
gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。
gcc最基本的用法是:gcc [options] [filenames]其中,options就是编译器所需要的参数,filenames给出相关的文件名称,最常用的有以下参数:-c只编译,不链接成为可执行文件。
编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename确定输出文件的名称为output_filename。
同时这个名称不能和源文件同名。
如果不给出这个选项,gcc就给出默认的可执行文件 a.out 。
-g产生符号调试工具(GNU的 gdb)所必要的符号信息。
想要对源代码进行调试,就必须加入这个选项。
-O对程序进行优化编译、链接。
采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些,而且对执行文件的调试会产生一定的影响,造成一些执行效果与对应源文件代码不一致等一些令人“困惑”的情况。
因此,一般在编译输出软件发行版时使用此选项。
GCC命令参数-L与-l
GCC命令参数-L与-l为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。
-l参数和-L参数-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。
好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr /lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6 /lib -lX11参数,-L参数跟着的是库文件所在的目录名。
再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L /aaa/bbb/ccc -ltest另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib /libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。
make交叉编译参数
make交叉编译参数在使用make进行交叉编译时,可以通过以下参数来设置交叉编译环境:1. CC,指定交叉编译器的路径和名称。
例如,CC=arm-linux-gcc 表示使用arm-linux-gcc作为交叉编译器。
2. CXX,指定交叉编译器的路径和名称(用于C++代码)。
例如,CXX=arm-linux-g++ 表示使用arm-linux-g++作为交叉编译器。
3. AR,指定交叉编译环境中的静态库归档工具。
例如,AR=arm-linux-ar 表示使用arm-linux-ar作为静态库归档工具。
4. LD,指定交叉编译环境中的链接器。
例如,LD=arm-linux-ld 表示使用arm-linux-ld作为链接器。
5. CROSS_COMPILE,设置交叉编译器的前缀。
例如,CROSS_COMPILE=arm-linux表示交叉编译器的前缀为arm-linux-。
6. ARCH,指定目标架构。
例如,ARCH=arm 表示目标架构为ARM。
7. SYSROOT,指定交叉编译环境的根目录。
例如,SYSROOT=/path/to/sysroot 表示交叉编译环境的根目录为/path/to/sysroot。
8. CFLAGS,设置编译选项。
可以通过CFLAGS参数传递特定的编译选项,如优化级别、宏定义等。
9. LDFLAGS,设置链接选项。
可以通过LDFLAGS参数传递特定的链接选项,如库路径、库名称等。
使用这些参数,你可以根据具体的交叉编译环境进行设置,确保make能够正确地进行交叉编译。
记住,在设置这些参数时,要根据实际情况替换为你所使用的交叉编译工具链的路径和名称。
Makefile中的CFLAGS,LDFLAGS,LIBS
Makefile中的CFLAGS,LDFLAGS,LIBSCFLAGS:C编译器选项,⽽CXXFLAGS表⽰C++编译器的选项1. CFLAGS参数选项说明-c⽤于把源码编译成.o对象⽂件,不进⾏链接过程-o⽤于连接⽣成可执⾏⽂件,在其后可以指定输出⽂件的名称-g⽤于在⽣成的⽬标可执⾏⽂件中,添加调试信息,可以使⽤GDB调试-Idir⽤于把新⽬录添加到include路径上,可以使⽤相对和绝对路径,"-I.", "-I./include", "-I/opt/include"-Wall⽣成常见的所有告警信息,且停⽌编译,这个使⽤最普遍-w关闭所有告警信息-O表⽰编译器优化选项,其后可跟优化等级0-1-2-3,默认是0,不优化-fPIC⽤于⽣成位置⽆关的代码-v显⽰执⾏编译阶段的命令,同时显⽰编译器驱动程序,预处理器,编译器的版本号CFLAGS主要功能:输出⽂件名称,可调试,编译告警,指定头⽂件⽬录2. LDFLAGS参数选项说明-llibrary链接时在标准搜索⽬录中寻找库⽂件,搜索名为 liblibrary.a 或 liblibrary.so-Ldir⽤于把新⽬录添加到库搜索路径上,可以使⽤相对和绝对路径,"-L.", "-L./include", "-L/opt/include"-Wl,option把选项option传递给连接器,如果option中含有逗号,就在逗号处分割成多个选项-static使⽤静态库连接⽣成⽬标⽂件,避免使⽤共享库,⽣成⽬标⽂件会⽐使⽤动态链接库⼤LDFLAGS的功能:围绕着编译时使⽤的库⽂件,添加库⽂件的路径3. LIBS告诉链接器要链接哪些库⽂件,如LIBS = -lpthread,-lm(链接线程库和数学库)简单地说,LDFLAGS是告诉链接器从哪⾥寻找库⽂件,⽽LIBS是告诉链接器要链接哪些⽂件,不过使⽤时链接阶段这两个参数都会加上,所以将这两个值互换,也没有问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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返回,节省调用函数的一条指令。