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

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是一个编译选项&…...

【DEVOPS】Jenkins使用问题 - 控制台输出乱码
0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式,即作为Master节点的Jenkins只负责任务调度,具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…...
logback-spring.xml
<?xml version"1.0" encoding"UTF-8"?> <configuration> <appender name"stdout" class"ch.qos.logback.core.ConsoleAppender"> <encoder> <springProfile name"dev"> <pattern>%d{…...

华为OD机试之报文重排序【Java源码】
题目描述 对报文进行重传和重排序是常用的可靠性机制,重传缓中区内有一定数量的子报文,每个子报文在原始报文中的顺序已知,现在需要恢复出原始报文。 输入描述 输入第一行为N,表示子报文的个数,0 <N ≤ …...

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)效…...

DPU在东数西算背景下如何赋能下一代算力基础设施 中科驭数在未来网络发展大会论道
以ChatGPT为代表的人工智能大模型的快速发展,对网络信息技术创新发展提出了新的挑战,我国东数西算重大工程也在加速布局。以确定性网络、算力网络为代表的未来网络核心技术,正成为决定未来经济和产业发展的关键。 8月23日,第七届…...

2021年12月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右…...

ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题
问题: 因未知原因Windows下的Server安装账户密码变更,但是又忘记了密码,导致,Server服务启动失败,错误1069: 解决方法: 在账户管理界面,重置对应的arcgis账户的密码,…...
React 面试题集锦
目录 如果想要在组件第一次加载后获取该组件的dom元素,应当在以下哪个生命周期中进行 React支持的键盘事件是 使用严格模式(Strict Mode)优点 React 动态引入组件 当使用ReactDOM.unmountComponentAtNode从DOM中卸载组件时 说一下useS…...

xargs命令解决“Argument list too long”
一、xargs命令概述 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。空格是其默认定界符,管道传递给xargs的输入…...
R语言中<- 的含义
一般语言的赋值是 号,但是 R 语言是数学语言,所以赋值符号与我们数学书上的伪代码很相似,是一个左箭头 <- : 举个例子: a <- 12 b <- 45 print(a b) 以上代码执行结果:57 这个赋值符号是 R …...

知识图谱Neo4j安装到实践全过程
前言: Hello大家好,我是Dream。 在本次实战中,我们将一起完成知识图谱Neo4j安装到实践全过程,探索其中的关系和属性。知识图谱是一种以三元组形式存储的数据结构,由实体、关系和属性组成,能够帮助我们更好地…...

贪心算法:简单而高效的优化策略
在计算机科学中,贪心算法是一种简单而高效的优化策略,用于解决许多组合优化问题。虽然它并不适用于所有问题,但在一些特定情况下,贪心算法能够产生近似最优解,而且计算成本较低。在本文中,我们将深入探讨贪…...
一生一芯6——ubuntu rpm软件安装
ubuntu不支持rpm,需要将rpm软件安装包转成deb进行安装 安装alien sudo apt-get install alien格式转换 sudo alien xxx.rpm 在目录下会生成deb的安装包 软件安装 sudo dpkg -i xxx_amd64.deb 安装完成...

Python练习 函数取列表最小数
练习2:构造一个功能函数,可以解决如下问题: 要求如下: 1,任意输入一个列表,函数可以打印出列表中最小的那个数, 例:输入: 23,56,67,4,17,9 最小数是 :4 方法一: #内置函…...

五种重要的 AI 编程语言
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 简而言之:决定从哪种语言开始可能会令人生畏。 不用担心!本文将解释 AI 中使用的最流行编程语言背后的基础知识,并帮助您决定首先学习哪种语言。对于每种语言,我们将…...

【linux】2 make/Makefile和gitee
文章目录 一、Linux项目自动化构建工具-make/Makefile1.1 背景1.2 实例代码1.3 原理1.4 项目清理 二、linux下第一个小程序-进度条2.1 行缓冲区2.2 进度条 三、git以及gitee总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ" 一…...
db-gpt安装指南(docker版本)
1 下载源码 下载v0.3.5的源码,截止今天(20230823)建议安装这个“稳定”版本。 2 构建镜像 依照自己硬件环境,看看是否要调整一下启动参数。 bash docker/build_all_images.sh \ --base-image nvidia/cuda:11.7.1-devel-ubuntu…...
「Java」《深度解析Java Stream流的优雅数据处理》
《深度解析Java Stream流的优雅数据处理》 一、引言1.1 背景1.2 Stream流的意义 二、Stream流的基本概念2.1 什么是Stream流2.2 Stream与传统集合的对比 三、创建Stream流3.1 通过集合创建Stream3.2 使用Arrays和Stream.of创建Stream3.3 从文件和网络流创建Stream 四、 中间操作…...

【云驻共创】华为云之手把手教你搭建IoT物联网应用充电桩实时监控大屏
文章目录 前言1.什么是充电桩2.什么是IOT3.什么是端、边、云、应用协同4.什么是Astro轻应用 一、玩转lOT动态实时大屏(线下实际操作)1.Astro轻应用说明1.1 场景说明1.2 资费说明1.3 整体流程 2.操作步骤2.1 开通设备接入服务2.2 创建产品2.3 注册设备2.4…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...