GNU-gcc编译选项-1

include目录

-I  ,比如:

-I. 

 -I ./Platform/include

-I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes  

编译选项

在GCC编译器中,-D是一个编译选项,用于定义预处理器宏。

预处理器宏是一种在编译过程中进行文本替换的机制。通过使用-D选项,可以在编译时为源代码中的标识符定义一个宏,并将其替换为指定的值。

例如,使用-DDEBUG选项可以定义一个名为DEBUG的宏,并将其替换为1。在源代码中,可以使用#ifdef或#ifndef等条件编译指令来根据宏的定义情况执行不同的代码。

下面是一个示例:

#include <stdio.h>

int main() {

#ifdef DEBUG

    printf("Debug mode is enabled\n");

#else

    printf("Debug mode is disabled\n");

#endif

    return 0;

}


如果使用gcc -DDEBUG test.c命令编译上述代码,则会定义DEBUG宏,并将其替换为1。因此,编译后的可执行文件将输出"Debug mode is enabled"。如果不使用-DDEBUG选项,则宏将未定义,编译后的可执行文件将输出"Debug mode is disabled"。

示例

当使用GCC编译器时,可以使用-D选项来定义预处理器宏。下面是一些使用示例:

1. 定义一个简单的宏:

   gcc -DDEBUG main.c -o program

这将定义一个名为DEBUG的宏,并将其替换为1。在编译main.c文件时,所有出现DEBUG的地方都将被替换为1。

2. 定义一个带有值的宏:

   gcc -DVERSION=\"1.0\" main.c -o program

这将定义一个名为VERSION的宏,并将其替换为字符串"1.0"。在编译main.c文件时,所有出现VERSION的地方都将被替换为"1.0"。

3. 定义多个宏:

   gcc -DDEBUG -DVERSION=\"1.0\" main.c -o program

这将同时定义DEBUG和VERSION两个宏,并将它们分别替换为1和"1.0"。

4. 在Makefile中使用-D选项:

   CFLAGS = -DDEBUG -DVERSION=\"1.0\"

   program: main.c

       gcc $(CFLAGS) main.c -o program

这将在Makefile中定义了一个CFLAGS变量,其中包含了要传递给GCC的编译选项。在编译时,可以使用$(CFLAGS)来引用这些选项。

通过使用-D选项,可以在编译时为源代码中的标识符定义宏,并根据需要进行替换。这样可以根据不同的编译配置或条件来控制代码的行为。

-DPACKAGE_NAME=\"ms-tpm-20-ref\" 
-DPACKAGE_TARNAME=\"ms-tpm-20-ref\" -DPACKAGE_VERSION=\"0.1\" 
-DPACKAGE_STRING=\"ms-tpm-20-ref\ 0.1\" 
-DPACKAGE_BUGREPORT=\"https://github.com/microsoft/ms-tpm-20-ref/issues\" 
-DPACKAGE_URL=\"https://github.com/microsoft/ms-tpm-20-ref\" 
-DPACKAGE=\"ms-tpm-20-ref\" 
-DVERSION=\"0.1\" 
-DHAVE_PTHREAD_PRIO_INHERIT=1 
-DHAVE_PTHREAD=1 
-DHASH_LIB=Ossl 
-DSYM_LIB=Ossl 
-DMATH_LIB=Ossl 

-std=gnu11

-std=gnu11 是GCC编译器的一个选项,用于指定C语言的标准版本。

具体来说,-std=gnu11 表示使用GNU C11标准。C11是C语言的第五个标准版本,于2011年发布。GNU C11是对C11标准的扩展,它包含了一些GNU扩展和特性。

使用-std=gnu11选项告诉GCC编译器使用C11标准及其GNU扩展来编译源代码。这意味着可以使用C11标准中引入的新特性和语法,以及GNU扩展提供的额外功能。

需要注意的是,-std=gnu11选项是GCC特定的选项,可能在其他编译器中不被支持。如果要编写可移植的C代码,建议使用更通用的标准,如-std=c11,它只使用C11标准而不包含GNU扩展。

-pthread -g -O2 -MD -MP -MF

这些输入是GCC编译器的一些选项和参数。

- -pthread:这是一个编译选项,用于启用对多线程程序的支持。它会链接线程库,以便在编译后的可执行文件中使用多线程功能。

- -g:这是一个编译选项,用于在编译过程中生成调试信息。调试信息包含了源代码和编译后的可执行文件之间的映射关系,以便在调试器中进行源代码级别的调试。

- -O2:这是一个优化选项,用于启用编译器的优化级别2。优化级别控制编译器对代码进行优化的程度,级别越高,优化效果越明显,但编译时间可能会增加。

- -MD:这是一个预处理选项,用于生成依赖关系文件。依赖关系文件记录了源代码文件及其所包含的头文件之间的依赖关系,以便在后续的编译过程中自动重新编译受影响的文件。

- -MP:这是一个预处理选项,用于生成空的目标规则。目标规则用于描述源代码文件和目标文件之间的依赖关系,-MP选项可以确保即使某个依赖文件被删除,目标规则仍然存在。

- -MF:这是一个预处理选项,用于指定生成的依赖关系文件的名称。-MF后面需要指定一个文件名,用于保存生成的依赖关系。

这些选项和参数用于在GCC编译过程中控制编译器的行为,包括启用多线程支持、生成调试信息、进行代码优化以及生成依赖关系文件。

-Wall -Wformat-security -fstack-protector-all -fPIC -Wno-error=empty-body -Wno-error=parentheses -Wno-error=pointer-to-int-cast -Wno-error=missing-braces -Wno-error=unused-result

这些输入是GCC编译器的一些警告选项。

- -Wall:这是一个警告选项,用于启用所有常见的警告信息。它会让编译器生成关于潜在问题的警告,帮助开发者发现潜在的错误或不良的编码实践。

- -Wformat-security:这是一个警告选项,用于检查格式化字符串函数(如printf)的参数是否存在安全问题。它会发出警告,以防止潜在的格式化字符串漏洞。

- -fstack-protector-all:这是一个编译选项,用于在编译过程中启用堆栈保护机制。它会在函数调用时检查堆栈的完整性,以防止缓冲区溢出攻击。

- -fPIC:这是一个编译选项,用于生成位置无关代码(Position Independent Code,PIC)。它在编译共享库时使用,以便在内存中加载和重定位代码时更加灵活。

- -Wno-error=empty-body、-Wno-error=parentheses、-Wno-error=pointer-to-int-cast、-Wno-error=missing-braces、-Wno-error=unused-result:这些是警告选项,用于禁止特定类型的警告被视为错误。通过在选项前加上-Wno-error前缀,可以将这些警告变为非致命的警告,而不会导致编译错误。

这些选项用于在GCC编译过程中控制警告的生成和处理。它们可以帮助开发者发现潜在的问题和改进代码质量。

`test -f xxx `

在GCC中,test -f xxx 不是GCC编译器的选项或参数,而是一个Shell命令。

test -f xxx 是一个用于检查文件是否存在的Shell命令。其中,-f 是test命令的选项,用于检查给定的路径是否是一个普通文件。

具体来说,test -f xxx 的作用是检查路径 xxx 是否存在,并且是一个普通文件。如果文件存在且是一个普通文件,则该命令的返回值为真(0),否则返回值为假(非0)。

在GCC编译过程中,可以使用这个Shell命令来检查某个文件是否存在,然后根据结果来执行不同的操作或编译规则。例如,可以在Makefile中使用这个命令来检查某个源文件是否存在,然后决定是否编译它。

示例:

gcc 
-DPACKAGE_NAME=\"ms-tpm-20-ref\" 
-DPACKAGE_TARNAME=\"ms-tpm-20-ref\" -DPACKAGE_VERSION=\"0.1\" 
-DPACKAGE_STRING=\"ms-tpm-20-ref\ 0.1\" 
-DPACKAGE_BUGREPORT=\"https://github.com/microsoft/ms-tpm-20-ref/issues\" 
-DPACKAGE_URL=\"https://github.com/microsoft/ms-tpm-20-ref\" 
-DPACKAGE=\"ms-tpm-20-ref\" 
-DVERSION=\"0.1\" 
-DHAVE_PTHREAD_PRIO_INHERIT=1 
-DHAVE_PTHREAD=1 
-DHASH_LIB=Ossl 
-DSYM_LIB=Ossl 
-DMATH_LIB=Ossl 
-I.    
-std=gnu11  -Wall -Wformat-security -fstack-protector-all -fPIC -Wno-error=empty-body -Wno-error=parentheses -Wno-error=pointer-to-int-cast -Wno-error=missing-braces -Wno-error=unused-result 
-I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes  
-pthread -g -O2 
-MT Simulator/src/Simulator_src_tpm2_simulator-TcpServer.o 
-MD -MP -MF 
Simulator/src/.deps/Simulator_src_tpm2_simulator-TcpServer.Tpo -c 
-o Simulator/src/Simulator_src_tpm2_simulator-TcpServer.o `test -f 'Simulator/src/TcpServer.c' || echo './'`Simulator/src/TcpServer.c
 

 

gcc中ar指令和ranlib指令

 在GCC中,ar和ranlib是两个与静态库(archive)相关的命令。

1. ar命令:
ar命令用于创建、修改和提取静态库。它可以将一组目标文件(object files)打包成一个静态库文件(archive file),后缀通常为.a。静态库是一种包含多个目标文件的归档文件,可以在链接时与其他目标文件一起使用。

一些常见的ar命令选项包括:
- ar rcs libname.a file1.o file2.o ...:创建一个静态库文件libname.a,并将file1.o、file2.o等目标文件添加到库中。r选项表示替换(replace),c选项表示创建(create),s选项表示创建索引(create index)。
- ar t libname.a:列出静态库文件libname.a中包含的目标文件列表。
- ar x libname.a:从静态库文件libname.a中提取出所有目标文件。

2. ranlib命令:
ranlib命令用于为静态库文件创建索引。索引是一个用于加速静态库访问的数据结构,它包含了静态库中每个目标文件的位置和其他信息。

一般情况下,ranlib命令会自动在使用ar命令创建静态库时被调用,以确保静态库包含正确的索引。因此,通常不需要手动调用ranlib命令。

这些命令在GCC中用于处理静态库文件,可以创建、修改和提取静态库,以及为静态库创建索引。它们是在编译和链接过程中使用静态库的重要工具。

示例

ar cru tpm/src/libtpm.a   xxx1/xxx1.o xxx2/xxx2.o xxx3/xxx3.o ...

ranlib tpm/src/libtpm.a

-MT

在GCC中,-MT是一个编译选项,用于指定生成的目标文件的名称。

具体来说,-MT选项后面需要指定一个目标文件的名称。这个名称将用作编译器生成的目标文件的名称。

例如,使用以下命令编译一个源文件:

gcc -c -MT objfile.o source.c

这将编译source.c文件,并生成一个名为objfile.o的目标文件。

-MT选项通常与-c选项一起使用,用于生成目标文件而不进行链接。它允许您为生成的目标文件指定一个自定义的名称,而不是使用默认的命名规则。

请注意,-MT选项只影响生成的目标文件的名称,不会影响生成的可执行文件或库文件的名称。如果需要指定生成的可执行文件或库文件的名称,可以使用-o选项。

-c -o -MT

在GCC中,-c、-o和-MT是三个常用的编译选项。

- -c选项表示编译源代码文件而不进行链接。它告诉GCC只执行编译阶段,生成目标文件(object file),而不生成最终的可执行文件或库文件。这在需要分阶段编译时非常有用,例如在构建大型项目时,可以先编译所有源文件生成目标文件,然后再进行链接

- -o选项用于指定生成的可执行文件或库文件的名称。它后面需要跟上一个文件名作为参数,用于指定生成的输出文件的名称。例如,-o program将生成一个名为program的可执行文件或库文件。

- -MT选项用于指定生成的目标文件的名称。它后面需要跟上一个文件名作为参数,用于指定生成的目标文件的名称。这个选项通常与-c选项一起使用,用于为生成的目标文件指定一个自定义的名称。

例如,使用以下命令编译一个源文件并生成目标文件:

gcc -c -MT objfile.o source.c

这将编译source.c文件,并生成一个名为objfile.o的目标文件。

综合起来,-c选项用于编译源代码文件,-o选项用于指定生成的可执行文件或库文件的名称,-MT选项用于指定生成的目标文件的名称。这些选项可以根据需要进行组合使用,以满足特定的编译需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Diff算法

文章目录 React Diff算法一、它的作用是什么&#xff1f;二、React的Diff算法1.了解一下什么是调和&#xff1f;2.react的diff算法3.React Diff的三大策略4.tree diff&#xff1a;1、如果DOM节点出现了跨层级操作&#xff0c;Diff会怎么办? 5. component diff&#xff1a;6. e…

element 下拉组件获取对象

// 选择数据user:[{name:"小白",id:1,money:"100",love:"蛋糕"},{name:"小黑",id:2,money:"200",love:"奶茶"},{name:"小红",id:3,money:"300",love:"烧烤"},] <div><el…

电商数据采集和数据分析

不管是做渠道价格的治理&#xff0c;还是做窜货、假货的打击&#xff0c;都需要品牌对线上数据尽数掌握&#xff0c;准确的数据是驱动服务的关键&#xff0c;所以做好电商数据的采集和分析非常重要。 当线上链接较多&#xff0c;品牌又需要监测线上数据时&#xff0c;单靠人工肯…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

spark第四课

countByValue 数据源中相同的值有多少个,也就是WordCount countByKey 表的是键值对中的key出现了几次,与Value的值无关 不推荐collect,因为他是将数据放入内存,但是内存不够大的话,就容易崩,所以使用saveAsTextFile更好,直接放入磁盘. 保存成对象文件,需要序列化 启动了2个 J…

设计模式之中介者模式(Mediator)的C++实现

1、中介者模式的提出 在软件组件开发过程中&#xff0c;如果存在多个对象&#xff0c;且这些对象之间存在的相互交互的情况不是一一对应的情况&#xff0c;这种功能组件间的对象引用关系比较复杂&#xff0c;耦合度较高。如果有一些新的需求变化&#xff0c;则不易扩展。中介者…

『论文精读』FastViT(ICCV 2023,Apple开源)论文解读

『论文精读』FastViT(ICCV 2023&#xff0c;Apple开源)论文解读 文章目录 一. FastViT简介二. 模型架构2.1. Stage 的内部架构2.2. Stem 的结构2.3. Patch Embedding 的架构2.4. 位置编码 三. 参考文献 论文下载链接&#xff1a;https://arxiv.org/pdf/2303.14189.pdf论文代码…

TCP的可靠性之道:确认重传和流量控制

TCP 全称为 Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;其中可靠性是相对于其他传输协议的优势点。TCP 为了确保数据传输的可靠性主要做了以下几点&#xff1a; 发送确…

Java云原生框架Quarkus初探

Java云原生框架Quarkus初探 Quarkus 介绍 Quarkus 是一个云原生&#xff0c;容器优先的Java应用框架&#xff0c;它号称是超音速和亚原子的框架&#xff0c;主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制&#xff0c; 根据Java库和…

食品安全”有救了“!温湿度监控快速见效!

在储存、运输和加工过程中&#xff0c;适当的温湿度条件对于保持食品的新鲜度、延长货物寿命以及防止食品交叉污染至关重要。通过精确的温湿度监测和实时数据分析&#xff0c;食品行业能够降低损失、提高产品质量&#xff0c;并满足监管要求。 在这个竞争激烈的行业中&#xff…

曲面(弧面、柱面)展平(拉直)瓶子标签识别ocr

瓶子或者柱面在做字符识别的时候由于变形&#xff0c;识别效果是很不好的 或者是检测瓶子表面缺陷的时候效果也没有展平的好 下面介绍两个项目&#xff0c;关于曲面&#xff08;弧面、柱面&#xff09;展平&#xff08;拉直&#xff09; 项目一&#xff1a;通过识别曲面的6个点…

2023CCF图形学启明星计划夏令营感想记录

这篇就是纯日记了&#xff0c;想记录一下参加这个夏令营的感想&#xff0c;中间的一些过程&#xff0c;毕竟这对我来说算是一段难忘的经历。 一、了解到的渠道 我个人是比较喜欢图形渲染的&#xff0c;之前也学过GAMES的课程&#xff0c;然后偶然的一天&#xff0c;GAMES101里…

Qt 阴影边框

阴影边框很常见&#xff0c;诸如360以及其他很多软件都有类似效果&#xff0c;了解CSS3的同学们应该都知道box-shadow&#xff0c;它就是来设定阴影效果的&#xff0c;那么Qt呢&#xff1f;看过一些资料&#xff0c;说是QSS是基于CSS2的&#xff0c;既然如此&#xff0c;box-sh…

目标检测笔记(十一):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)

文章目录 背景代码结果 背景 由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务&#xff0c;所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测&#xff0c;以OpenCV自带的包为例。 一般来说有两种方式实现区域指定&…

Numpy学习笔记

科学计算库&#xff08;Numpy&#xff09; 通常数据都能转换成矩阵&#xff0c;行就是每一条样本数据&#xff0c;列就是每个字段的特征&#xff0c;Numpy在矩阵运算上非常高效&#xff0c;可以快速处理数据并进行数据计算。 Numpy基本操作 先导入 import numpy as nparray…

告别数字化系统“物理叠加”,华为云推动智慧门店价值跃迁

文|智能相对论 作者|叶远风 有大屏幕滚动播放广告&#xff1b; 有人脸识别系统让消费者自助结账&#xff1b; 有订单管理系统综合分析一段时间内总体经营情况&#xff1b; 有全门店监控直连总部机房&#xff1b; …… 以搭载数字化系统的硬件设备为表面特征的智慧门店&a…

OS 内核级线程代码实现

state和counter实现阻塞和时间片的判断是否跳转进程 先把旧内容通过TR放入原TSS&#xff0c;通过TR找到新TSS然后把TSS内容拷入CPU内部&#xff0c;通过esp值变化实现栈的切换。ip使用的copy的ip

Spring-MVC的数据响应-19

在访问服务端MVC的时候&#xff0c;这个controller层进行相应操作之后 他要做两件事&#xff1a;页面跳转和返回字符串&#xff0c;在做完这些操作之后&#xff0c;我们一般进行页面展示:排除页面展示之外&#xff0c;有些需求可能直接回写给我们一些数据&#xff1a; 页面跳…

亚马逊云科技CEO谈及企业领导力原则的核心:坚持顾客至上

亚马逊云科技首席执行官Adam Selipsky几乎从一开始就在那里&#xff1a;他于2005年加入&#xff0c;在效力亚马逊11年后于2016年离开&#xff0c;转而经营Tableau&#xff0c;并于2021年成为亚马逊云科技首席执行官。当时亚马逊云科技前首席执行官安迪贾西(Andy Jassy)接替杰夫…

idea的断点调试

1、行断点 首先在代码的最左侧点击会显示红色的圆圈 第二步在main方法中右键选中debug run进行运行 会出现下面图片的情况 出现上图之后&#xff0c;点击console 下一步 这个时候就可以看到调试的结果了 6、方法调用栈&#xff1a;这里显示了该线程调试所经过的所有方法&…