技术先进的网站建设,黄骅市属于沧州吗,seo薪酬如何,如何做网站营销推广目录 1. Linux编译器-gcc/g1.1 编译器gcc/g的工作步骤1.2 函数库1.2.1 函数库的作用及分类1.2.2 动态链接和静态链接1.2.3 动态库和静态库的优缺点 1.3 gcc选项 2. Linux项目自动化构建工具-make/Makefile2.1 .PHONY2.2 尝试编写进度条程序 3. git3.1 安装 git3.2 下载项目到本… 目录 1. Linux编译器-gcc/g1.1 编译器gcc/g的工作步骤1.2 函数库1.2.1 函数库的作用及分类1.2.2 动态链接和静态链接1.2.3 动态库和静态库的优缺点 1.3 gcc选项 2. Linux项目自动化构建工具-make/Makefile2.1 .PHONY2.2 尝试编写进度条程序 3. git3.1 安装 git3.2 下载项目到本地3.3 三板斧第一招: git add3.3 三板斧第二招: git commit3.4 三板斧第三招: git push3.5查看三板斧的情况git status 4. Linux调试器-gdb4.1 gdb的使用 1. Linux编译器-gcc/g
1.1 编译器gcc/g的工作步骤
预处理进行宏替换) 实例: gcc –E hello.c –o hello.i编译生成汇编) 实例: gcc –S hello.i –o hello.s汇编生成机器可识别代码 实例: gcc –c hello.s –o hello.o链接生成可执行文件或库文件) 实例: gcc hello.o –o hello
1.2 函数库
1.2.1 函数库的作用及分类
函数库是在链接过程中涉及的重点
我们的C程序中并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
函数库一般分为静态库和动态库两种。
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
1.2.2 动态链接和静态链接
动态链接和静态链接 在Linux中编译形成可执行程序默认采用的就是动态链接–提供动态库 tatic 在Linux中如果要按照静态链接的方式进行形成可执行程序需要添加-static选项 – 提供静态库 如果我们没有静态库但是我们就要-static行不行呢? 不行 如果我们没有动态库只有静态库而且没有添加-static选项gcc能找到吗-----能的gcc默认优先动态链接若没有动态库或动态库里没找到就会使用静态链接去静态库 static的本质:改变优先级并且让所有的连接要求全部变成静态链接 链接不一定是纯的全部动态链接或者静态链接有时是混合的!
1.2.3 动态库和静态库的优缺点
动态库
优动态库因为是共享库有效的节省资源(磁盘空间内存空间网络空间等)缺动态库一旦缺失,导致各个程序都无法运行
静态库
优静态库不依赖库程序可以独立运行缺体积大比较消耗资源
1.3 gcc选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件.i后缀里面-S 编译到汇编语言不进行汇编和链接.s后缀-c 将汇编语言翻译成机器可识别代码即可重定位目标二进制文件简称目标文件.o后缀.obj文件 目标文件该类文件虽然已经是二进制文件但是仍不能执行需要经过链接才能执行-o 文件输出到指定文件-static 此选项对生成的文件采用静态链接-g 生成调试信息。GNU 调试器可利用该信息。-shared 此选项将尽量使用动态库所以生成文件比较小但是需要系统由动态库.-O0-O1-O2-O3 编译器的优化选项的4个级别-O0表示没有优化,-O1为缺省值-O3优化级别最高-w 不生成任何警告信息。-Wall 生成所有警告信息。
2. Linux项目自动化构建工具-make/Makefile
makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。make是一条命令makefile是一个文件两个搭配使用完成项目自动化构建make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件 2.1 .PHONY
.PHONY使指令总是被执行 我们有时会看到这样的情况 这是因为 mycode.c 文件已经生成了 mycode 文件且之后没有修改 mycode.c 文件。 这样设计的优点提高了效率 原理通过对比 mycode.c 文件 和 mycode 文件 的最近修改时间的先后 来确定mycode.c 是否更新情况。 原理详细讲解一定是源文件形成可执行现有源文件才有可执行一般而言源文件的最近修改时间比可执行文件要老。但如果我们更改了源文件历史上曾经还有可执行那么源文件的最近修改时间一定要比可执行程序要新!所以只需要比较可执行程序的最近修改时间和源文件的最近修改时间、(.exe 新于 .c 源文件是老的不需要重新编译.exe 老于.c源文件是老的需要重新编译 .PHONY通过更改mycode.c 文件的修改时间无论文件是否修改来使mycode.c文件一定会被执行
2.2 尝试编写进度条程序
进度条程序的简单版原理版
//processBar.c
#includeprocessBar.h
#includestring.h
#includeunistd.hchar bar[NUM];
memset(bar,\0,sizeof(bar));const char* icon|/-\\;
void processBar()
{int lenstrlen(icon);int cnt0;while(cntTOP) //每循环一次进度1循环了101次最后一次加的进度进度条没有被记录到缓存区{printf([%-100s][%d%%][%c] \r,bar,cnt,icon[cnt%len]);fflush(stdout);bar[cnt]STYLE; //进度1;if(cnt99) bar[cnt]STYLE_TAIL;usleep(TIME); //0.05s单位是微秒。 unistd.h是头文件}printf(\n);}
//processBar.h
#pragma once#includestdio.h#define NUM 102
#define STYLE -
#define STYLE_TAIL
#define TIME 50000 //0.05s 总5s
#define TOP 100extern void processBar();//main.c:
#includeprocessBar.h
#includeunistd.hint main()
{processBar();return 0;
}输出结果截图
修饰重装版更完善、全面
//processBar.c
#define _CRT_SECURE_NO_WARNINGS 1
#includeprocessBar.h
#includestdio.h
#includestring.h
#includeunistd.h//进度条
char bar[NUM]; //全局数组默认初始化为0//进度进行的旋转标志
const char* icon |/-\\;//把当前比率转化为进度条,并为下一次加一个小格一个百分点
//rate[0,100]
void processBar(int rate)
{if (rate 0 || rate100) return;int len strlen(icon);printf(ANSI_COLOR_GREEN[%-100s]ANSI_COLOR_END[%d%%][%c]\r, bar, rate, icon[rate % len]);fflush(stdout);bar[rate] STYLE;if (rate 99) bar[rate] STYLE_TAIL;
}void initbar()
{memset(bar, \0, sizeof(bar));
}
//main.c
#define _CRT_SECURE_NO_WARNINGS 1#includeprocessBar.h
#includeunistd.htypedef void(*callback_t)(int); //函数指针类型void download(callback_t cb)
{int total 1000; //总共1000MBint curr 0; //现在共加载0MBwhile (curr total){Sleep(50000); //0.05s模拟加载时间int rate curr * 100 / total; //更新进度//processBar(rate);cb(rate); //通过回调显示进度curr 10; //因为processBar函数为下一个循环加载了一个百分点,//所以curr要加上total*1%10进度条、百分号才会一一对应}printf(\n);initbar();
}int main()
{download(processBar);//download(processBar);return 0;
}//processBar.h
#pragma once#includestdio.h#define NUM 102
#define STYLE
#define STYLE_TAIL
#define TIME 50000 //0.05s 总5s
#define TOP 100#define ANSI_COLOR_GREEN \x1b[32m
#define ANSI_COLOR_END \x1b[0mextern void processBar(int rate);extern void initbar();输出结果截图
3. git
3.1 安装 git
yum install git3.2 下载项目到本地
创建好一个放置代码的目录。 这里的 url 就是刚刚建立好的 项目 的链接
git clone [url]3.3 三板斧第一招: git add
将代码放到刚才下载好的目录中 文件名是要上传的文件的名字
git add [文件名]3.3 三板斧第二招: git commit
提交改动到本地
git commit -m 提交日志3.4 三板斧第三招: git push
git push3.5查看三板斧的情况git status
git status4. Linux调试器-gdb
使用程序的发布方式有两种debug模式和release模式Linux gcc/g出来的二进制程序默认是release模式要使用gdb调试必须在源代码生成二进制程序gcc编译时的时候, 加上 -g 选项即必须是debug模式
4.1 gdb的使用
listl 行号显示binFile源代码接着上次的位置往下列每次列10行。listl 函数名列出某个函数的源代码。r或run运行程序break(b) 行号在某一行设置断点break 函数名在某个函数开头设置断点info break 查看断点信息。delete breakpoints删除所有断点delete breakpoints n删除序号为n的断点n 或 next单条执行逐过程不进入函数s或step进入函数调用逐语句进入函数p 变量打印变量值。display 变量名跟踪查看一个变量每次停下来都显示它的值undisplay 编号取消对先前设置的那些变量的跟踪until X行号跳至X行finish执行到当前函数返回然后挺下来等待命令可以快速的判断问题是不是出在某一个函数里c从一个断点运行到另一个断点与 r 功能差不多disable 断点编号禁掉断点enable 断点编号解除断点被禁状态quit、ctrl d退出gdb