1. makefile文件和make命令
1.1 安装
和以往的gcc,g++同一个操作
1.2 makefile文件和make命令的介绍
Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。
由于一个大型项目工程中有大量的源文件,个人编译起来容易漏一个,这个时候就可以使用makefile文件,makefile文件利用定义了一系列的规则来帮助我们去管理这些源文件,指定了哪些文件先进行编译,哪些源文件后进行编译,哪些文件被修改了,需要重新编译。 make命令:解释makefile文件,执行对应的操作 示例如下: 假设这里有三个源文件:main.c max.c add.c 接下来:对其进行编译: 假设,这里不是三个源文件,而是非常多,自己编译容易漏,并且如果我们修改其中的一部分源文件,那么我们应该只对其中修改过的源文件进行重新编译最合理的,这里makefile文件可以完美达到我们的需求。
makefile具体代码实现
通过make命令运行一下makefile文件:
如果需要保证编译后的整洁,则可以在makefile的最后加上clean:
2. gdb调试
2.1 Debug版本和Release版本
Debug版本,是可调式版本,具有调试信息。 Debug版本如何生成:gcc默认生成的是release版本,如果需要手动添加参数-g 命令格式如下: 第一种:gcc -c main.c -g(生成具有调试信息的中间文件main.o),再通过命令gcc -o main main.o 第二种:gcc -o main main.c -g
2.2 gdb应用
测试文件:main.c 通过gcc -o main main.c -g 一步生成具有可调式信息的可执行文件: 运行起来,发现输入“end”的时候,正常退出不了: 这时,我们用gdb调试一下可执行文件main,找一下问题所在: 命令: l //显示当前文件的源代码(默认一次显示10行)
1. 库文件的生成和使用
1.1 什么是库文件?
库是一组预先编译好的方法的集合 Linux上的库的位置:/lib 和 /usr/lib 但是在红帽子上,/lib和/usr/lib分开 库有两种形态:静态库和动态库(共享库) linux:静态库(libxxx.a),动态库(libxxx.so) windows:静态库(.lib),动态库(.dll)
1.2 静态库如何生成和使用
1.2.1 静态库的生成
下面会有准备生成静态库的三个文件:max.c add.c和fun.h 第一步:先讲源文件编译成".o"文件
第二步:使用ar命令将第一步产生的“.o”文件,生成对应的静态库
- c 创建库
- r 将对应方法添加到库中
- v 显示执行过程
- t 显示库中包含的方法
1.2.2 静态库的使用
现在有测试文件main.c的代码内容:
1.3 动态库如何生成和使用
1.3.1 动态库的生成
下面会有准备生成静态库的三个文件:max.c add.c和fun.h 第一步:先讲源文件编译成".o"文件 第二步:使用gcc命令将第一步一步产生的“.o”文件,生成对应的动态库
gcc -shared -fPIC -o libxxx.so max.o add.o
- -shared 生成动态库
- -fPIC 说明生成的动态库中的方法使用相对地址
1.3.2 动态库的使用
现在有测试文件main.c的代码内容: 运行起来,发现可执行文件main,能生成,但是执行起来会报错,会说找不到相应的共享库,因为可执行文件main执行起来发现需要共享库funs,它直接回去标准路径下/usr/lib去找,这时肯定找不到,所以会报错,解决方案就是将生成的动态库libfuns.so拷贝一份放到/usr/lib下,就不会报错了: 假设当前路径下,有同名的静态库和动态库,那么可执行文件链接的是哪一个库?
1.4 静态库和共享库的区别
静态库在链接时将用到的方法包含到最终生成的可执行程序中** 共享库不包含,只做标记,在运行程序时,才动态加载
|