C语言编译链接,C++如何编译

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: