C语言编译链接,C++如何编译
在Windows中,我们经常使用vs来编译写好的C和C代码。vs在这个工具中集成了编辑器、编译器、调试器等工具。在linux下,我们通常使用vim编辑器,然后用gcc和G编译链接,生成可执行程序。
很难说C有独立的编译器,比如Windows下的微软编译器(cl.exe),Linux下的GCC编译器,Mac下的Clang编译器(已经是Xcode默认编译器,雄心勃勃,决心超越GCC),都是同时支持C语言和C的,统称为C/C编译器。对于C语言代码,用C语言的方式编译;对于C代码,用C的方式编译。
1.我们先来看一下从C源代码到可执行文件的过程:
1)预处理:
经过预处理后,将产生一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义和原始文件是一样的,只是内容不同。
处理#定义宏指令,扩展和替换宏;处理#if.条件编译指令,过滤不必要的代码;Handle #include预编译指令,包括头文件;删除评论;添加行号,用于调试;2)编译:
语法分析;词法分析;生成相应的汇编代码;3)编译:
将汇编代码转换成相应的机器语言,即目标文件;
4)链接:
通过调用链接器,将程序运行所需的大量目标文件和其他依赖的库文件链接起来,最终形成一个可执行文件。
2.gcc和g命令:
熟悉C的人都应该知道,C是C语言的超集。写C/C代码时,有人用gcc,有人用G,我们先来看看gcc和G是否都能编译C和C代码:
1)对于c文件:
Gcc和G做的完全一样。编译C文件时调用了gcc。
2)对于cpp文件:
对于以下test.cpp:
#包括iostream
使用命名空间std
int main()
{
cout hello c endl
返回0;
} gcc和G的预处理和组装都可以;但是编译链接gcc会报错,因为#include iostream是代码中C的标准库,G使用C的标准库将目标文件与libstdc库中的函数链接得到一个可执行文件,而gcc使用C的标准库,所以会报错。了解了这些,遵循源代码的命名规范,指定相应库的名称,用gcc编译链接C程序是可行的,如下例所示:gcc命令编译,连接:
gcc test.cpp -lstdc -o helloworld
通过选项-l(小写L)指定C的动态库名,并将其拼接到libstdc中。根据默认规则:前缀lib和后缀。a.
总结:
gcc和G的区别主要是在编译和链接cpp文件的过程中。由于cpp和C文件中库文件的命名方式不同,gcc无法直接编译链接C程序。那为什么G可以同时编译C和C?这是因为G在内部处理,默认编译C程序,但是如果遇到C程序,会直接调用gcc来编译。
3.用G编译步骤的详细说明:
1)预处理-E(源文件-预处理文件)
g -E hello.cpp -o hello.i-o选项指定生成的文件。如果在此步骤中没有指定,预编译文件将在终端输出。下面步骤中的-o也是如此,即会生成指定的文件。
2) Compile -S(大写,预处理文件-汇编语言文件)
G -S hello.ii或g -S hello.cpp默认生成hello.s。
3) Assembly -c(汇编语言文件-可重定向的目标文件)
G -c hello.s或g -c hello.cpp默认生成二进制形式的hello.o目标文件。
4)链接多个。o文件-可执行文件
比如有1.cpp和2.cpp。
G -c 2.cpp //生成2.o
G -c 1.cpp //生成1.o
g . o 2.o-o hello.out//directly 1 . o跟上2 . o(用空格隔开),-o指定为hello,默认为a.out
或者
你好,完毕
g *。你好,出去
G *。cpp -o hello.out4,g命令:
4.1)用头文件和多个源文件编译和连接程序:
1)当我们只编译一个main.cpp文件时,直接输入:
G.CPP-o主2)多个源文件
C/c是分开编译的,所以多个源文件可以分开编译,然后连接在一起。例如:
G.cppmain.cpp-o main3)当我们需要编译头文件和源文件如:common.h和main.cpp文件时:
3.1)假设common.h与main.cpp在同一个文件夹中:
Main.cpp是用#include common.cpp 引入的,那么可以直接编译:
G.cpp-i./-o main或g main.cpp -o main3.2)假设common.h在/home/user/include文件夹中:
a、main.cpp用绝对路径或相对路径(# include /home/user/include/common . h )引入,然后用以下命令编译:
G.cpp-o mainb和main.cpp由#include common.cpp 引入,直接编译时用-I表示路径(绝对路径或相对路径):
Main . CPP-I/home/user/include/-o Main Summary:可以通过g -I参数指定头文件位置,也可以在源文件中指定头文件路径。
注意:用g命令编译链接时,不需要跟在头文件后面,因为编译时头文件会直接在源文件中展开。
4.2)使用第三方库
1)在编译链接时,需要指定以下参数:
-L:指定库文件路径;-l:指定库文件名(根据默认规则:前缀lib,后缀。a/so);-I: (size i)指定头文件的路径(include);2)运行时:
您需要配置LIBRARY_PATH和LD_LIBRARY_PATH环境变量,或者在/etc/ld.so.conf文件中指定库文件路径(或者将库文件放在默认的库文件路径/lib、/usr/lib中.),然后执行ldconfig刷新/etc/LD . so . cache;4.3)调试
为了进行调试,我们需要生成一个包含调试信息的可执行文件。编译时,添加一个编译器参数(-g)来添加调试信息。然后用gdb工具调试。
4.4)其他gcc/g参数选项
-shared:指定生成动态链接库。-fPIC:生成与位置无关的代码。在生成共享库(动态库)时,应该创建位置无关的代码,这样会使共享库使用任意地址,而不是固定地址。-static:指定生成静态链接库。-L:指定要连接的库所在的目录。-l:指定链接所需的库名(动态/静态)。当编译器查找链接库时,有一个隐式的命名规则:即在给定的名字前加上lib和。a/。所以在它确定了图书馆的名称之后。-I:(大写I)指定头文件的文件夹。-Wall:生成所有警告消息。-ggdb:该选项将尽可能多地生成gdb的可用调试信息。-g:编译器在编译时生成调试信息。-o:指定可执行文件的名称;-E:预处理,-S:汇编,-c:编译成目标代码(。o);
原创作品来自正在路上的博主,转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。