C深度解析
最编程
2024-03-06 18:26:19
...
1.IDE开发方式与源文件开发方式
2.C程序的详细编译过程
3.静态链接与动态链接
4.目标文件种类
5.可重定位目标文件
6.可执行目标文件
7.内存结构(存储映像)
1. IDE开发方式与源文件开发方式
1.1 演示
1.1.1 IDE方式
1.1.2 源文件开发方式
其实就是编辑与编译分开操作的方式
gcc helloworld.c helloworld.exe
(1)windows
如果想在任意位置都可以编译我们的程序的话,我们需要将编译器所在的目录加入
windows的环境变量,有关环境变量,我们在《Linux系统编程、网络编程》有详细介绍
(2)ubuntu
1)使用ubuntu的VI或者gedit编辑器编辑
2)使用ubuntu自带的gcc编译器来编译
gcc helloworld.c -o helloworld
gcc这个编译器是GNU这个组织开发的
总结:
(a)ubuntu安装好后,会自带c编译器gcc,不过windows没有自带c编译器,所以我使用的
是codeblocks所带的编译器
(b)ubuntu下的安装目录有加入环境变量,因此可以在任何路径下运行gcc
1.2 源文件开发方式
1.2.1 什么是源文件开发方式
其实就是编辑、编译是分开开发的方式
编辑:使用单独的编辑器来编写程序
编译:在命令执行编译程序(命令)来编译所写的c程序
1.2.2 分开的开发方式,其实有不少麻烦之处
(1)你需要安装两个东西,一个是编辑器,另一个是编译器
(2)使用单独编辑器,也有缺点
使用的编辑器不见得是专门针对程序开发的编辑器,使用起来很麻烦,你比如直接
使用windows自带的txt文件编辑器写程序的话,老实讲用起来糟心,因为它不是为程序
编写而生的。
如果你觉得txt这个编辑器不好,可以下载一个你觉得比较好的其它的编辑器,就算是
这样,编辑器相比IDE的编辑器来说,也差了一些,毕竟IDE的编辑器是专门针对程序开发的
(3)自己安装编译器也很麻烦
(4)命令行的使用也很麻烦
1.2.3 IDE方式
IDE方式其实就是将编辑器和编译器二合一后的结果
IDE方式很好的解决了编辑和编译分开情况所带来的麻烦,怎么解决的呢?
1.2.3.1 只需一次性安装IDE即可
一次性安装好IDE后,IDE就自带了编辑器和编译器
1.2.3.2 IDE自带的编辑器更加专业,更加人性化
因为IDE自带编辑器,是专门适合程序开发的编辑器,比如我们在程序开发的时候,
语法关键字的自动提示,一般的编辑器是没有的,但是IDE提供的编辑器就会有。
我在写程序时往往记不住关键字,特别是C++和java这种面向对象语言的开发,类里面
包含很多的成员,如果编辑器不提供自动提示功能,这会非常痛苦。
特别是涉及到界面开发时,会进行到控件的拖拽,如果不使用IDE提供的专门的编辑器
的话,普通编辑器根本不提供控件拖拽的功能
1.2.3.3 不涉及编译器的选型问题
安装某个环境(windows x86)的IDE时,IDE自带的就是这个环境的编译器,不需要
操心编译器的选型。
编译器并不是一个独立的程序,而是由众多程序组合在一起的一个程序集合,我们安装
IDE时,编译器集合会被自动包含在IDE的安装目录下。
举例:codeblocks、vc++、eclipse
如果你觉得这个编译器不好,实际上你可以自己下载其他的编译器,然后将它包含到IDE
的安装目录下,然后在IDE里面做设置,使用这个新的编译器即可。
设置举例:codeblocks
不过一般不会这么做,你要是觉得这个编译器不好,还不如干脆换一个新版本的IDE,会
自带新的编译器。
1.2.3.4 编译程序时,调用编译器的过程是IDE自动完成的,而且是图形化操作,不需要使用
命令行来操作。
比如以codeblocks为例,只需要点击编译运行的按钮即可,IDE会自动的调用编译器程序
来编译。
图形界面调用编译器,与我们在命令行调用编译器程序来编译是一样的,但是IDE提供
的图形化方式显然更加方便。
1.3 综合对比
1.3.1 IDE是主流
因为IDE确实更加方便,特别是像开发c++/jave/c#/python等这类面向对象语言的程序
时,基本只能使用IDE方式来操作,因此必须使用IDE的自动提示功能。
1.3.2 分开方式难道就没有用了吗
不是的,对于底层框架类代码的开发来说,还是有用的,因为底层框架类的代码基本
都是使用c、汇编这类语言来实现的,不涉及类成员的提示,不涉及界面控件的拖拽,完全
可以使用这种方式来开发。
其实就算是开发框架代码,如果使用IDE方式的话,其实更方便些,不过对于很多有能力
的程序员来说,在开发框架代码时,有些还是喜欢使用编辑、编译分开的方式,为什么?
1)他们有能力这么做
其实编辑、编译分开的方式,并不是谁想使用就能用的,这种方式对于能力要求较高,
比如最起码一点,命令行必须要会,但是就命令行这一点,不少开发者可能就被难住了。
2)分开的方式更*
IDE做的越好就越傻瓜化,傻瓜的好处是,对程序员来说使用特别简单,但是坏处是,
IDE帮你自动做了太多的设置,但是有些设置根本不是你想要的,所以很多大牛不喜欢
IDE的自作主张,所以他们更喜欢自己做主,而编辑、编译分开的方式,就完全可以按照
自己的想法来,不受IDE的干扰。
1.4 进行Linux嵌入式开发,为什么会使用编辑、编译分开的方式呢?
(1)因为进行Linux嵌入式开发时,所开发的大多是c程序,而且大多不涉及界面问题(因为
好多嵌入式设备没有界面),这种情况与开发框架非常类似,所以适合使用这种情况。
(2)ubuntu自带的vi(命令行编辑器)和gedit(图形编辑器)用起来还可以,而且安装好
ubuntu后,会自带针对当前环境的c编译器gcc,无需自己安装,所以省去了一些麻烦。
当前后续开发在arm上运行的嵌入式程序时,还是需要我们自己安装针对Linux、arm环境的
编译器。
(3)编辑、编译分开开发的方式,依赖于命令行的使用,而Linux嵌入式开发有一个最大的特点
是,要求我们必须会Linux的命令行,所以对于Linux开发者来说,命令行的使用是小意思。
(4)编辑、编译分开的开发方式,是本源开发方式,通过使用这种开发方式,可以更好的理解
一些本质性的问题,在一定程度上,有助于提升大家的能力,所以我们鼓励使用分开开发的方式。
1.5 如果Linux嵌入式开发也涉及到C++、java的话,使用什么开发方式呢
1.5.1 嵌入式开发会用到C++/java吗?
会,因为虽然不少Linux嵌入式产品不需要图形界面,但是有些还是要的,此时我们会使用
C++的qt图形库或者java图形库来开发。
其实基本使用的是C++/QT来开发的,因为java需要运行虚拟机这个东西,比较吃计算机资源。
如果开发的是与安卓相关的嵌入式产品的话,会用到java。
1.5.2 在Linux怎么进行C++/java开发
前面说过开发C++/jave等面向对象语言的程序时,都是使用IDE来开发的。
所以如果在linux嵌入式开发中,涉及到C++/java程序的开发时,我们还是需要安装相应的
IDE来开发,使用编辑,编译分开方式,基本不可能。
2.C程序的详细编译过程
3.静态链接与动态链接
4.目标文件种类
5.可重定位目标文件
6.可执行目标文件
7.内存结构(存储映像)
1. IDE开发方式与源文件开发方式
1.1 演示
1.1.1 IDE方式
1.1.2 源文件开发方式
其实就是编辑与编译分开操作的方式
gcc helloworld.c helloworld.exe
(1)windows
如果想在任意位置都可以编译我们的程序的话,我们需要将编译器所在的目录加入
windows的环境变量,有关环境变量,我们在《Linux系统编程、网络编程》有详细介绍
(2)ubuntu
1)使用ubuntu的VI或者gedit编辑器编辑
2)使用ubuntu自带的gcc编译器来编译
gcc helloworld.c -o helloworld
gcc这个编译器是GNU这个组织开发的
总结:
(a)ubuntu安装好后,会自带c编译器gcc,不过windows没有自带c编译器,所以我使用的
是codeblocks所带的编译器
(b)ubuntu下的安装目录有加入环境变量,因此可以在任何路径下运行gcc
1.2 源文件开发方式
1.2.1 什么是源文件开发方式
其实就是编辑、编译是分开开发的方式
编辑:使用单独的编辑器来编写程序
编译:在命令执行编译程序(命令)来编译所写的c程序
1.2.2 分开的开发方式,其实有不少麻烦之处
(1)你需要安装两个东西,一个是编辑器,另一个是编译器
(2)使用单独编辑器,也有缺点
使用的编辑器不见得是专门针对程序开发的编辑器,使用起来很麻烦,你比如直接
使用windows自带的txt文件编辑器写程序的话,老实讲用起来糟心,因为它不是为程序
编写而生的。
如果你觉得txt这个编辑器不好,可以下载一个你觉得比较好的其它的编辑器,就算是
这样,编辑器相比IDE的编辑器来说,也差了一些,毕竟IDE的编辑器是专门针对程序开发的
(3)自己安装编译器也很麻烦
(4)命令行的使用也很麻烦
1.2.3 IDE方式
IDE方式其实就是将编辑器和编译器二合一后的结果
IDE方式很好的解决了编辑和编译分开情况所带来的麻烦,怎么解决的呢?
1.2.3.1 只需一次性安装IDE即可
一次性安装好IDE后,IDE就自带了编辑器和编译器
1.2.3.2 IDE自带的编辑器更加专业,更加人性化
因为IDE自带编辑器,是专门适合程序开发的编辑器,比如我们在程序开发的时候,
语法关键字的自动提示,一般的编辑器是没有的,但是IDE提供的编辑器就会有。
我在写程序时往往记不住关键字,特别是C++和java这种面向对象语言的开发,类里面
包含很多的成员,如果编辑器不提供自动提示功能,这会非常痛苦。
特别是涉及到界面开发时,会进行到控件的拖拽,如果不使用IDE提供的专门的编辑器
的话,普通编辑器根本不提供控件拖拽的功能
1.2.3.3 不涉及编译器的选型问题
安装某个环境(windows x86)的IDE时,IDE自带的就是这个环境的编译器,不需要
操心编译器的选型。
编译器并不是一个独立的程序,而是由众多程序组合在一起的一个程序集合,我们安装
IDE时,编译器集合会被自动包含在IDE的安装目录下。
举例:codeblocks、vc++、eclipse
如果你觉得这个编译器不好,实际上你可以自己下载其他的编译器,然后将它包含到IDE
的安装目录下,然后在IDE里面做设置,使用这个新的编译器即可。
设置举例:codeblocks
不过一般不会这么做,你要是觉得这个编译器不好,还不如干脆换一个新版本的IDE,会
自带新的编译器。
1.2.3.4 编译程序时,调用编译器的过程是IDE自动完成的,而且是图形化操作,不需要使用
命令行来操作。
比如以codeblocks为例,只需要点击编译运行的按钮即可,IDE会自动的调用编译器程序
来编译。
图形界面调用编译器,与我们在命令行调用编译器程序来编译是一样的,但是IDE提供
的图形化方式显然更加方便。
1.3 综合对比
1.3.1 IDE是主流
因为IDE确实更加方便,特别是像开发c++/jave/c#/python等这类面向对象语言的程序
时,基本只能使用IDE方式来操作,因此必须使用IDE的自动提示功能。
1.3.2 分开方式难道就没有用了吗
不是的,对于底层框架类代码的开发来说,还是有用的,因为底层框架类的代码基本
都是使用c、汇编这类语言来实现的,不涉及类成员的提示,不涉及界面控件的拖拽,完全
可以使用这种方式来开发。
其实就算是开发框架代码,如果使用IDE方式的话,其实更方便些,不过对于很多有能力
的程序员来说,在开发框架代码时,有些还是喜欢使用编辑、编译分开的方式,为什么?
1)他们有能力这么做
其实编辑、编译分开的方式,并不是谁想使用就能用的,这种方式对于能力要求较高,
比如最起码一点,命令行必须要会,但是就命令行这一点,不少开发者可能就被难住了。
2)分开的方式更*
IDE做的越好就越傻瓜化,傻瓜的好处是,对程序员来说使用特别简单,但是坏处是,
IDE帮你自动做了太多的设置,但是有些设置根本不是你想要的,所以很多大牛不喜欢
IDE的自作主张,所以他们更喜欢自己做主,而编辑、编译分开的方式,就完全可以按照
自己的想法来,不受IDE的干扰。
1.4 进行Linux嵌入式开发,为什么会使用编辑、编译分开的方式呢?
(1)因为进行Linux嵌入式开发时,所开发的大多是c程序,而且大多不涉及界面问题(因为
好多嵌入式设备没有界面),这种情况与开发框架非常类似,所以适合使用这种情况。
(2)ubuntu自带的vi(命令行编辑器)和gedit(图形编辑器)用起来还可以,而且安装好
ubuntu后,会自带针对当前环境的c编译器gcc,无需自己安装,所以省去了一些麻烦。
当前后续开发在arm上运行的嵌入式程序时,还是需要我们自己安装针对Linux、arm环境的
编译器。
(3)编辑、编译分开开发的方式,依赖于命令行的使用,而Linux嵌入式开发有一个最大的特点
是,要求我们必须会Linux的命令行,所以对于Linux开发者来说,命令行的使用是小意思。
(4)编辑、编译分开的开发方式,是本源开发方式,通过使用这种开发方式,可以更好的理解
一些本质性的问题,在一定程度上,有助于提升大家的能力,所以我们鼓励使用分开开发的方式。
1.5 如果Linux嵌入式开发也涉及到C++、java的话,使用什么开发方式呢
1.5.1 嵌入式开发会用到C++/java吗?
会,因为虽然不少Linux嵌入式产品不需要图形界面,但是有些还是要的,此时我们会使用
C++的qt图形库或者java图形库来开发。
其实基本使用的是C++/QT来开发的,因为java需要运行虚拟机这个东西,比较吃计算机资源。
如果开发的是与安卓相关的嵌入式产品的话,会用到java。
1.5.2 在Linux怎么进行C++/java开发
前面说过开发C++/jave等面向对象语言的程序时,都是使用IDE来开发的。
所以如果在linux嵌入式开发中,涉及到C++/java程序的开发时,我们还是需要安装相应的
IDE来开发,使用编辑,编译分开方式,基本不可能。