时光飞逝~

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)

今天的每日一博结束,睡觉

 

posted on 2013-04-08 00:16  时光飞逝~  阅读(2008)  评论(0)    收藏  举报