资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

预处理命令linux,预处理命令以什么开头

在一个C语言的程序中,是否允许任意数量的include命令行!求大神!求解析!

一般是可以的, include是预处理命令,它有预处理器来完成,在linux的开发环境中,它对应于cpp 有这个应用程序的。

创新互联建站服务项目包括浦口网站建设、浦口网站制作、浦口网页制作以及浦口网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,浦口网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到浦口省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

如果进行嵌套include那会出问题的。这时候都会有相应的提示的。

linux Makefile问题.S.s: $(CPP) $(CFLAGS) $< -o $*.s什么意思

请慢慢看,真要详细讲起来,文字实在太多了,但是由于时间原因,我只能以粗略的文字讲,语言有一些逻辑漏洞,请见谅。

首先我会以粗略的文字回答你的其中一个问题,然后后面会给出第二个问题的答案。

问:什么时候会执行这些规则及其相对应的命令?

答:当你给make命令指定了它要生成的终极目标时,它会从要生成的终极目标寻址依赖的依赖条件,然后依赖条件一级一级的查找并执行相对应的命令。即如果当有目标需要.s、.o这些依赖条件的时候,会取找要生成.s、.o目标的依赖条件,这个时候就会执行这些规则:

.S.s:

$(CPP) $(CFLAGS) $ -o $*.s

.S.o:

$(CC) $(CFLAGS) -c $ -o $*.o

.c.o:

$(CC) $(CFLAGS) -c $ -o $*.o

一、

源代码文件必须经过:预处理(cpp)、编译(ccl)、汇编(as)、链接(ld)。这四个阶段最终才得到可执行的程序:

makefile里定义了变量CPP=cpp;其中$(CPP)的意思是去定义变量CPP里的值:cpp,用cpp来预处理源文件。

$(CFLAGS)的意思是取定义变量CDLAGS里面的值,一般是一些自我定义的预处理命令和编译命令的参数。

$的意思是:在规则的命令中,表示第一个依赖条件

-o是一个预处理、编译等执行命令需要的参数

/*

其实这条命令:$(CPP) $(CFLAGS) $ -o $*.s,就是一条预处理命令,将一个源文件预处理为.s文件后缀的文件,*为通配符。那源文件在哪里呢。其实这条命令.S.s: 已经说了以.S结尾的文件就是源文件。那这条命令.S.s这么说了呢?请看下面的后缀规则讲解。

*/

二、

老式风格的"后缀规则"

后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地取代。因为模式规则更强更清晰。为了和老版本的Makefile兼容,GNU make同样兼容于这些东西。后缀规则有两种方式:"双后缀"和"单后缀"。

双后缀规则定义了一对后缀:目标文件的后缀和依赖目标(源文件)的后缀。如".c.o"相当于"%o : %c"。单后缀规则只定义一个后缀,也就是源文件的后缀。

后缀规则中所定义的后缀应该是make所认识的,如果一个后缀是make所认识的,那么这个规则就是单后缀规则,而如果两个连在一起的后缀都被make所认识,那就是双后缀规则。例如:".c"和".o"都是make所知道。

因而,如果你定义了一个规则是".c.o"那么其就是双后缀规则,意义就是".c" 是源文件的后缀,".o"是目标文件的后缀。如下示例:

.c.o:

$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $

其中.c.o:这个命令表示源文件的后缀为.c,目标文件的后缀为.o;即也可理解为:生成.o的目标文件依赖条件是源文件.c

下面命令是将是所有的.c源文件都编译成.o的目标文件。

注:后缀规则不允许任何的依赖文件,如果有依赖文件的话,那就不是后缀规则,那些后缀统统被认为是文件名,

如:

.c.o: foo.h

$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $

这个例子,就是说,文件".c.o"依赖于文件"foo.h",而不是我们想要的这样:

%.o: %.c foo.h

$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $

因此后缀规则不允许任何的依赖文件。

Linux下gcc命令怎么使用,详细的参数说明

用法:gcc [选项] 文件...

选项:

-pass-exit-codes 在某一阶段退出时返回最高的错误码

--help 显示此帮助说明

--target-help 显示目标机器特定的命令行选项

(使用‘-v --help’显示子进程的命令行参数)

-dumpspecs 显示所有内建 spec 字符串

-dumpversion 显示编译器的版本号

-dumpmachine 显示编译器的目标处理器

-print-search-dirs 显示编译器的搜索路径

-print-libgcc-file-name 显示编译器伴随库的名称

-print-file-name=库 显示 库 的完整路径

-print-prog-name=程序 显示编译器组件 程序 的完整路径

-print-multi-directory 显示不同版本 libgcc 的根目录

-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射

-print-multi-os-directory 显示操作系统库的相对路径

-Wa,选项 将逗号分隔的 选项 传递给汇编器

-Wp,选项 将逗号分隔的 选项 传递给预处理器

-Wl,选项 将逗号分隔的 选项 传递给链接器

-Xassembler 参数 将 参数 传递给汇编器

-Xpreprocessor 参数 将 参数 传递给预处理器

-Xlinker 参数 将 参数 传递给链接器

-combine 将多个源文件一次性传递给汇编器

-save-temps 不删除中间文件

-pipe 使用管道代替临时文件

-time 为每个子进程计时

-specs=文件 用 文件 的内容覆盖内建的 specs 文件

-std=标准 指定输入源文件遵循的标准

--sysroot=目录 将 目录 作为头文件和库文件的根目录

-B 目录 将 目录 添加到编译器的搜索路径中

-b 机器 为 gcc 指定目标机器(如果有安装)

-V 版本 运行指定版本的 gcc(如果有安装)

-v 显示编译器调用的程序

-### 与 -v 类似,但选项被引号括住,并且不执行命令

-E 仅作预处理,不进行编译、汇编和链接

-S 编译到汇编语言,不进行汇编和链接

-c 编译、汇编到目标代码,不进行链接

-o 文件 输出到 文件

-x 语言 指定其后输入文件的语言

允许的语言包括:c c++ assembler none

‘none’意味着恢复默认行为,即根据文件的扩展名猜测

源文件的语言

以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的

不同子进程。若要向这些进程传递其他选项,必须使用 -W字母 选项。

常见的预处理命令有哪两种?

很多小伙伴在自己写代码的时候,已经多次使用过include命令。使用库函数之前,应该用include引入对应的头文件。其实这种以#号开头的命令称为预处理命令。

C语言源文件要经过编译、链接才能生成可执行程序:

1) 编译(Compile)会将源文件(.c文件)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀为.o。

编译是针对单个源文件的,一次编译操作只能编译一个源文件,如果程序中有多个源文件,就需要多次编译操作。

2) 链接(Link)是针对多个文件的,它会将编译生成的多个目标文件以及系统中的库、组件等合并成一个可执行程序。

关于编译和链接的过程、目标文件和可执行文件的结构、.h 文件和 .c 文件的区别,我们将在后期专题中讲解。

在实际开发中,有时候在编译之前还需要对源文件进行简单的处理。例如,我们希望自己的程序在 Windows 和 Linux 下都能够运行,那么就要在 Windows 下使用 VS 编译一遍,然后在 Linux 下使用 GCC 编译一遍。但是现在有个问题,程序中要实现的某个功能在 VS 和 GCC 下使用的函数不同(假设 VS 下使用 a(),GCC 下使用 b()),VS 下的函数在 GCC 下不能编译通过,GCC 下的函数在 VS 下也不能编译通过,怎么办呢?

这就需要在编译之前先对源文件进行处理:如果检测到是 VS,就保留 a() 删除 b();如果检测到是 GCC,就保留 b() 删除 a()。

这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理、提前处理)。

预处理主要是处理以开头的命令,例如include stdio.h等。预处理命令要放在所有函数之外,而且一般都放在源文件的前面。

预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

编译器会将预处理的结果保存到和源文件同名的.i文件中,例如 main.c 的预处理结果在 main.i 中。和.c一样,.i也是文本文件,可以用编辑器打开直接查看内容。

C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程

各位大神请教一下,C++中编写程序为什么要用预处理命令,预处理命令有什么用?

预处理命令根据用途也分很多种。

但最重要的可能还是用来让你写的一份代码可以跑在多个环境下。

因为C++不像java那样有虚拟机来屏蔽运行环境,所以C++只能将与环境相关的地方用预处理来处理。

1 比如你的代码是动态库,又想运行在Windows下,又想运行在Linux下

2 你的代码有时候想在不同的环境下有不同的表现,比如调试模式下打一些日志,运行模式责不然

3 比如你的代码了解一种数据库的时候使用A代码,使用另一种数据库的时候使用B代码。

总之,C++的跨平台必须依赖于预处理。

希望我没有误导你。

linux中怎么生成预处理.i文件

Linux中通过gcc的-E参数可以生成预处理文件。

实例:生成t.c源码文件的预处理文件t.i

执行命令:gcc -E -o t.i t.c

下图以hello world程序为例。


本文标题:预处理命令linux,预处理命令以什么开头
网站链接:http://cdkjz.cn/article/dsigsog.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220