2024年9月如何利用gcc编译选项检测函数参数个数?cmd调用gcc编译c源码,并传参
⑴如何利用g编译选项检测函数参数个数?cmd调用g编译c源码,并传参
⑵如何利用g编译选项检测函数参数个数
⑶g的一个编译选项:-fstack-protector,以下是关于这个选项的描述:-fstack-protector启用该选项后编译器会产生额外的代码来检测缓冲区溢出,例如栈溢出攻击。这是通过在有缺陷的函数中添加一个保护变量来实现的。这包括会调用到alloca的函数.
⑷cmd调用g编译c源码,并传参
⑸下面将通过对一个程序的编译来演示整个过程。#include《stdio.h》intmain(){printf(“happynewyear!
⑹“);return;}:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用g的参数-E来参看。命令:g-Ehello.c-ohello.i作用:将hello.c预处理输出hello.i:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用g的参数-S来参看。编译器(l)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
⑺void-delay-us(double-us微秒级、void-delay-ms(double-ms毫秒级。g参数详解:gandg++分别是gnu的c和c++编译器gg++在执行编译工作的时候,总共需要步:、预处理,生成i的文件(预处理器cpp。、将预处理后的文件不转换成汇编语言,生成文件s(编译器egcs。、有汇编变为目标代码(机器代码生成o的文件(汇编器as。、连接目标代码,生成可执行程序(链接器ld。
⑻g-g-o-c分别是什么意思
⑼-c和-o都是g编译器的可选参数。
⑽-c表示只编译(pile)源文件但不链接,会把.c或.的c源程序编译成目标文件,一般是.o文件。-o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。
⑾g-ctest.c将生成test.o的目标文件
⑿g-oapptest.c将生成可执行程序app
⒀g-ca.c-oa.o表示把源文件a.c编译成指定文件名a.o的中间目标文件(其实在这里,把-oa.o省掉,效果是一样的,因为中间文件默认与源文件同名,只是后缀变化)。
⒁如果G不带-C参数,编译一个源代码文件(test.c)。那么会自动将编译和链接一步完成,并生成可执行文件。可执行文件可以有-o参数指定(test.o)
⒂如果是多个文件,则需要先编译成中间目标文件(一般是.o文件,在链接成可执行文件,一般习惯目标文件都是以.o后缀,也没有硬性规定可执行文件不能用.o文件。
⒃g:GNU编译器套件(GNUpilerCollection包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等。G的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。
⒄-ooutput_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,g就给出预设的可执行文件a.out。
⒅-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
⒆g有哪些命令参数
⒇用法:g文件...选项:-pass-exit-codes在某一阶段退出时返回最高的错误码--help显示此帮助说明--target-help显示目标机器特定的命令行选项(使用‘-v--help’显示子进程的命令行参数)-dumpspecs显示所有内建spec字符串-dumpversion显示编译器的版本号-dumpmachine显示编译器的目标处理器-print-search-dirs显示编译器的搜索路径-print-libg-file-name显示编译器伴随库的名称-print-file-name=《库》显示《库》的完整路径-print-prog-name=《程序》显示编译器组件《程序》的完整路径-print-multi-directory显示不同版本libg的根目录-print-multi-lib显示命令行选项和多个版本库搜索路径间的映射-print-multi-os-directory显示操作系统库的相对路径-Wa,《选项》将逗号分隔的《选项》传递给汇编器-Wp,《选项》将逗号分隔的《选项》传递给预处理器-Wl,《选项》将逗号分隔的《选项》传递给链接器-Xassembler《参数》将《参数》传递给汇编器-Xpreprocessor《参数》将《参数》传递给预处理器-Xlinker《参数》将《参数》传递给链接器-bine将多个源文件一次性传递给汇编器-save-temps不删除中间文件-pipe使用管道代替临时文件-time为每个子进程计时-specs=《文件》用《文件》的内容覆盖内建的specs文件-std=《标准》指定输入源文件遵循的标准--sysroot=《目录》将《目录》作为头文件和库文件的根目录-B《目录》将《目录》添加到编译器的搜索路径中-b《机器》为g指定目标机器(如果有安装)-V《版本》运行指定版本的g(如果有安装)-v显示编译器调用的程序-###与-v类似,但选项被引号括住,并且不执行命令-E仅作预处理,不进行编译、汇编和链接-S编译到汇编语言,不进行汇编和链接-c编译、汇编到目标代码,不进行链接-o《文件》输出到《文件》-x《语言》指定其后输入文件的语言允许的语言包括:++assemblernone‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言以-g、-f、-m、-O、-W或--param开头的选项将由g自动传递给其调用的不同子进程。若要向这些进程传递其他选项,必须使用-W《字母》选项。
⒈g编译程序时的命令行参数-I(大写i)-L-l(小写L)--
⒉我们用g编译程序时,可能会用到“-I”(大写i,“-L”(大写l,“-l”(小写l等参数,下面做个记录:例:g-Wall-I/home/hello/include-L/home/hello/libmain.c-lworld-Wl,-rpath,/you/dir/name-oprog上面这句表示在编译hello.c时:-I(大写i)/home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include--》/usr/include--》/usr/local/include-L/home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib--》/lib--》/usr/lib--》/usr/local/lib-l(小写的L)world表示在上面的lib的路径中寻找libworld.so动态库文件(如果g编译选项中加入了“-static”表示寻找libworld.a静态库文件-rpath=dir把目录添加到运行时类库搜索路径-Wl,option把选项传递给Linker.如果选项值包含逗号,就把他拆分成多个选项-Wl,-rpath,/opt/lib解决errorwhileloadingsharedlibraries:****.so:cannotopensharedobjectfile:Nosuchfileordirectory
⒊G编译器的参数与空格
⒋按照INSTALL中的介绍,也是常用的方法,在configure的时候,加上–host=arm-linux,结果没有实现我们要的效果,没有将编译器从默认的g改成arm-linux-g,编译器还是用的默认的g:[]$CFLAGS=-O(cached)gcheckingwhethertheompiler(g-O)works…yescheckingwhethertheompiler(g-O)isacross-piler…no………………..后来经过多次尝试,最后受默认的CFLAGS=-O进行配置所启发,想到,是否可以将参数传入到configure中,结果证实,如果没有自己的cache-file,即时加了对的参数,也还是无法传入:[]$CFLAGS=-O=arm-linux-(cached)gcheckingwhethertheompiler(g-O)works…yescheckingwhethertheompiler(g-O)isacross-piler…nocheckingwhetherweareusingGNUC…(cached)yes………………..而且,如果参数放在configure后面:则不能识别:[]$CFLAGS=-O参数传递必须像CFLAGS=-O一样,将参数设置放在configure的前面:=arm-linux-才能识别的。必须要自己制定自己的cache-file然后用进行新配置,加上参数,才会即时生效,编译器才可以变成我们要的arm-linux-g:[]$=arm-linux-(arm-linux-g)works…yescheckingwhethertheompiler(arm-linux-g)isacross-piler…yescheckingwhetherweareusingGNUC…yes………………..否则,就无法将我们的参数传入了:[]$=arm-linux-(cached)gcheckingwhethertheompiler(g)works…yescheckingwhethertheompiler(g)isacross-piler…nocheckingwhetherweareusingGNUC…(cached)yes………………..[]$CFLAGS=-O=arm-linux-(arm-linux-g-O)works…yescheckingwhethertheompiler(arm-linux-g-O)isacross-piler…yescheckingwhetherweareusingGNUC…yes最好此处在加上–prefix=/usr/crifan/lrzsz,表示具体安装到哪里[]$CFLAGS=-O=arm-linux-(arm-linux-g-O)works…yescheckingwhethertheompiler(arm-linux-g-O)isacross-piler…yescheckingwhetherweareusingGNUC…yes………………..其中,/usr/crifan/lrzsz是已经建立好的,已经存在的文件夹,上面这样表示编译后,将生成的可执行文件安装拷贝到那个目录.
⒌windows下的g编译器如何给主函数传参数
⒍g编译器不是传递参数用的,是编译程序代码,输出可执行对象。在windows的shell命令中,第一个参数是可执行文件名,后面的按照顺序对应主函数的参数。
⒎(Linux)g进行优化编译的参数是什么
⒏优化编译的参数是:-O-O-O-O不优化是-O详细情况用:mang阅读“OPTIMIZATIONOPTIONS“那部分
⒐g函数引用参数报错(C语言
⒑函数参数用&i是C++的引用格式,C是不支持这个的。在VC++下面这么些无所谓,那个本身模糊了C和C++的区别。不过G就不一样了,只支持C的语法,不支持C++,你这么写当然会报错。warning:returnmakesintegerfrompointerwithoutacast应该是你函数里的问题,返还的是一个指针,但定义的时候是整数。虽然不会有错,还是会有警告。检查一下这是不是你的本意,是的话就要用强制转换把指针变成整数,那样就不会报错。