UC高级编程(一)
一、关于unix系统
unix系统没过AT&T公司于1971年运行在PDP-11上的操作系统。
现在主要有三个派生版本 System V ,Berkley,Hybird
我们常用的linux是Hybird版本
linux系统需要了解的:
遵循GNU计划,POSIX标准,GPL通用公共许可证
具体的说我们现在用的linux都是以linux内核配合GNU操作系统的组合,习惯上叫做linux
二、GNU的编译工具
gcc,gcc的编译过程分为4个阶段
1.预处理 命令是gcc -E
2.汇编 命令是gcc -S
3.编译 命令是gcc -c
4.链接 命令是gcc
常用命令
gcc -Wall 生成尽可能多的警告
gcc -o制定输出文件
gcc -Werror要求编译器把警告当做错误来处理
gcc -g生成调试信息
另外推荐个无聊的小命令 gcc -v可以查看当前gcc的版本信息。
三、宏处理命令
#ifndef XXXX_H
#define XXXX_H
#endif
上面三行是保证一个头文件只被载入一次得常用写法
#if
#elif
#else
#endif
上面四个预处理命令常被用来完成条件编译
#error 产生错误,挂起预处理程序
#line 制定行号
#pragma 提供额外信息的标准方法,可用来指定平台。这个预处理命令比较常用,现举两个例子说明一下
#pragma poison goto //该句话的作用就是说程序中遇见共同就会报错
#pragma pack(2) //指定构造体中对齐补齐的方式为2个字节的整数倍。该方法常用来高效的利用内存。pack的参数只能是2的低次方,根据鄙人自己的测试,pack的参数最大是16。如果该结构体重的最大sizeof的类型的值比pack的参数大,则执行pack的对齐补齐方式,否则执行默认的。
#undef删除宏
#warning 创建一个警告
下面写个小程序来回顾一下这几个宏命令
View Code
1 //大家可根据自己的喜好随意测试 2 3 #include<stdio.h> 4 #define AGE 18//此处的年龄将按照下面的分支来执行 5 #if(AGE>18) 6 #error “年龄太大” 7 #elif(AGE<18) 8 #error"年龄太大" 9 #pragma poison goto //程序中见到goto即报错 10 #pragma pack(2) //结构体按照2字节对齐补齐 11 //...其他的就不一一列举了,比较简单 12 end if 13 //main函数测试一下 14 int main(void){ 15 #line(250) 16 printf("测试line"); 17 ok:printf("测试goto"); 18 struct a{ 19 char a; 20 int b; 21 char c; 22 }; 23 printf("测试pragma pack()",sizeof(a)); 24 goto ok;//此处报错,因为碰见了goto 25 return 0; 26 }
四、创建和使用静态库和动态库
A静态库
1.将主函数所在文件和头文件以外的所有文件用gcc -c static 文件名 (其中static可选,其作用是组织使用共享库)生成对应的.o文件
2.ar -r libXX.a 文件名.o(libXX.a中lib是应该保留的,XX是自己定的,这样写的原因是后面编译的时候会用到)
3.编译 3中方法
1gcc main.c libXX.a
2)gcc main.c -lmy //需要先用LIBRARY_PATH声明环境变量,方法export LIBRARY_PATH=./(声明环境变量为当前目录)
3)gcc main.c -lmy -L. //个人认为这种方法最简单实用
B共享库
1.将主函数所在文件和头文件以外的所有文件用gcc -c 文件名 生成对应的.o文件
2.gcc shared main.c -o libXX.os
3.和静态三种方法一样,但声明环境变量时用LD_LIBRARY_PATH
共享库有四个函数,大家熟悉一下
void* dlopen(const char* filename,int flag)//flag的两个选择RTLD_LAZY延迟查找,RTLD_NOW现在查找
void* dlsym(void* handle,void char* symbol)
char* dlerror(void)//此函数很简单,返回值非空则有错,空则无错
int dlclose(void* handle)
今天的每日一博结束,睡觉

浙公网安备 33010602011771号