GNU-gcc编译选项-1

这篇具有很好参考价值的文章主要介绍了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
 

GNU-gcc编译选项-1,TPM,cmake,算法

 

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选项用于指定生成的目标文件的名称。这些选项可以根据需要进行组合使用,以满足特定的编译需求。文章来源地址https://www.toymoban.com/news/detail-667747.html

到了这里,关于GNU-gcc编译选项-1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows下使用microsoft、intel、gnu不同编译器利用cmake和vscode对c++和fortran程序进行编译和调试

    由于编译器支持特性、编译后程序运行速度、安装使用便捷程度等的不同,我们往往会安装多种不同的编译器。对于c++语言主要的编译器有:microsoft、intel、gnu等,对于fortran语言则更多,包括gnu、intel、pgi等等。不同的编译器在一个系统下,往往需要利用一些手段进行区分,

    2024年02月05日
    浏览(55)
  • arm-none-eabi-gcc编译、链接选项详解

    \\\"- mthumb ”的意义是:使用这个编译选项生成的目标文件是Thumb指令的,目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb-2的。 相对应的,“-marm“的意义是,使用编译选项生成的目标文件是ARM指令的。 注意,不同编译器对该选项是否默认开启是不一样

    2024年02月11日
    浏览(40)
  • 嵌入式C编译工具:gcc/make/Autotools/cmake

    gcc时GNU编译套件,一种编译器,可以编译c,c++,java等语言。当只有一个文件时,使用gcc编译器就很方便,但是当有多个文件时,编译顺序以及包含关系等使用gcc很麻烦。 make工具:make就相当于一个智能的批处理工具,通过调用makefile实现编译,在makefile规定编译以及链接的顺序

    2024年02月02日
    浏览(50)
  • 【ARM 嵌入式 编译系列 2.5 -- GCC 编译参数学习 --specs=nano.specs选项 】

    请阅读 【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 ARM 工具链 ( arm-none-eabi- ) 包括了一个叫作 --specs 的编译器和链接器选项,这个选项允许用户指定一个或多个 “specs” 文件,以影响编译或链接阶段的行为。Specs 文件包含一系列的命令行参数,这些参数可以是编译器选项

    2024年01月22日
    浏览(47)
  • CMake入门教程【高级篇】编译选项target_compile_options

    target_compile_options 命令允许用户为特定目标(如可执行文件或库)指定编译器选项,这对于优化构建过程和确保代码兼容性至关重要。

    2024年01月15日
    浏览(39)
  • C/C++开发,linux下OpenCV+gcc+cmake编译环境搭建

    目录 一、源码下载 二、源码编译         2.1 OpenCV源码下载         2.2 cmake安装(非必要)         2.3 opencv安装依赖及支持模块查看         2.4 安装pkgconfig包         2.5 安装opencv依赖包         2.6 真正安装opencv包开始         2.7 opencv环境路径配置 三、案

    2024年02月06日
    浏览(51)
  • windows下qt creator 配置编译环境gcc,g++,gdb,cmake

    MSVC :即Microsoft Visual C++ Compiler,即微软自己的编译器 MinGW :我们都知道GNU在Linux下面鼎鼎大名的gcc/g++,MinGW则是指Minimalist GNU for Windows的缩写 这里我们选择MinGW,至于Qt中,这两种模式的区别,自行查阅相关资料 在Qt 安装完成之后,gcc.exe,g++.exe,qmake.exe就已经有了,我们可

    2024年02月09日
    浏览(51)
  • 【C/C++编译】CMake定义头文件路径、链接库路径及链接选项:PRIVATE,INTERFACE,PUBLIC

    在 CMake 中, 有许多常见的变量可用于配置和管理构建过程 。以下是一些常见的变量,包括当前源码路径: CMAKE_SOURCE_DIR : 当前 CMakeLists.txt 所在的源码目录的根路径 。 CMAKE_BINARY_DIR :构建目录的根路径,即 构建生成的可执行文件、库和其他构建输出的存放位置 。 CMAKE_CUR

    2024年02月11日
    浏览(43)
  • macOS - 安装 GNU make、cmake

    官网:https://cmake.org/ 使用 brew 安装 brew 安装 cmake: https://formulae.brew.sh/formula/cmake 安装使用 brew : https://blog.csdn.net/lovechris00/article/details/121613647 将安装在 /usr/local/Cellar/cmake/ 下,并链接至 /usr/local/bin /usr/local/Cellar/cmake/3.23.2/bin 下有以下四个可执行文件 ccmake cmake cpack ctest 查看版本

    2024年02月13日
    浏览(35)
  • MinGW/MSYS/GCC/GNU/MSVC/Clang/LLVM都是什么

    MinGW(Minimalist GNU for Windows)是一个用于 Windows平台的开发工具集 ,它提供了一组用于编译和构建应用程序的工具和库。它的目标是在Windows环境下提供一个类Unix的开发体验。 MinGW的 核心是GNU编译器集合(GCC) ,它是一个开源的编译器套件,支持多种编程语言,如C、C++和For

    2024年02月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包