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选项用于指定生成的目标文件的名称。这些选项可以根据需要进行组合使用,以满足特定的编译需求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java“牵手”天猫商品评论API接口数据,天猫API接口申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝商品详情页面评价内容数据&#xff0c;您可以通过开放平台的接口或者直接访问淘宝商城的网页来获取商品详情信息内的评论数据。以下是两种常用方法…

高效实用小工具之Everything

一&#xff0c;简介 有时候我们电脑文件较多时&#xff0c;想快速找到某个文件不是一件容易的事情&#xff0c;实用windows自带的搜索太耗时&#xff0c;效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything&#xff0c;本文将介绍如何安装以及使用everything&…

XXL-JOB

XXL-JOB是一个分布式的任务调度平台。 目的&#xff1a;为了自动完成特定的任务&#xff0c;在约定的特定时间去执行任务的过程。 原因&#xff1a;在spring中有scheduled&#xff0c;放到业务层代码上面也可以。但是其无法做到高可用、防止重复执行&#xff0c;单机处理极限…

uniapp使用uni.chooseLocation()打开地图选择位置

使用uni.chooseLocation()打开地址选择位置&#xff1a; 在Uniapp源码视图进行设置 添加这个属性&#xff1a;"requiredPrivateInfos":["chooseLocation"] ​ </template><view class"location_box"><view class"locatio…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…

Mybatis-动态sql和分页

目录 一.什么是Mybatis动态分页 二.mybatis中的动态SQL 在BookMaaper.xml中写sql BookMapper BookBiz接口类 BookBizImpl实现接口类 demo测试类 ​编辑 测试结果 三.mybatis中的模糊查询 mybatis中的#与$有是什么区别 在BookMapper.xml里面建立三个模糊查询 ​编辑 …

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part II 用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法&#xff08;环境VS2022openCV4.8.0&#xff09; Part I_松下J27的博客-CSDN博客 在上一篇文章中&#xff0c;我用cmake成功的生成了ope…

无涯教程-分类算法 - 逻辑回归

逻辑回归是一种监督学习分类算法&#xff0c;用于预测目标变量的概率&#xff0c;目标或因变量的性质是二分法&#xff0c;这意味着将只有两种可能的类。 简而言之&#xff0c;因变量本质上是二进制的&#xff0c;其数据编码为1(代表成功/是)或0(代表失败/否)。 在数学上&…

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

java八股文面试[数据结构]——ConcurrentHashMap原理

HashMap不是线程安全&#xff1a; 在并发环境下&#xff0c;可能会形成环状链表&#xff08;扩容时可能造成&#xff0c;具体原因自行百度google或查看源码分析&#xff09;&#xff0c;导致get操作时&#xff0c;cpu空转&#xff0c;所以&#xff0c;在并发环境中使用HashMap是…

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

图神经网络与分子表征:番外——基组选择

学过高斯软件的人都知道&#xff0c;我们在撰写输入文件 gjf 时需要准备输入【泛函】和【基组】这两个关键词。 【泛函】敲定计算方法&#xff0c;【基组】则类似格点积分中的密度&#xff0c;与计算精度密切相关。 部分研究人员借用高斯中的一系列基组去包装输入几何信息&am…

图论(基础)

知识&#xff1a; 顶点&#xff0c;边 | 权&#xff0c;度数 1.图的种类&#xff1a; 有向图 | 无向图 有环 | 无环 联通性 基础1&#xff1a;图的存储&#xff08;主要是邻接矩阵和邻接表&#xff09; 例一&#xff1a;B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (…

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端&#xff0c;实现相关的自定义处理。实现客户服务自动化&#xff0c;对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求&#xff0c;以进一…

常见的移动端布局

流式布局&#xff08;百分比布局&#xff09; 使用百分比、相对单位&#xff08;如 em、rem&#xff09;等来设置元素的宽度&#xff0c;使页面元素根据视口大小的变化进行调整。这种方法可以实现基本的自适应效果&#xff0c;但可能在不同设备上显示不一致。 <!DOCTYPE ht…