UC环境编程一-----------------编程环境

1.Unix族谱
在这里插入图片描述
2.GUN工程:基本原则就是共享,其主旨在于发展一个有别于一切商业Unix的,免费且完整的类Unit系统。
3.POSIX标准:统一的系统编程接口规范。
4.GPL通用公共许可证
5.构建过程:
1)编辑 vi hello.c->hello.c
2)预编译 gcc -E hello.c->hello.i
3)编译 gcc -s hello.i->hello.s
4)汇编 gcc -c hello.s->hello.o
5)链接 gcc hello.o ->a.out

6.编译单个源程序
gcc [选项] 文件
-c 只编译不链接
-o 指定输出文件
-E 预编译
-s 产生汇编文件
-pedantic 对不符合ANSI/ISO c标准的拓展语法产生错误
-Wall 产生尽可能多的警告
-Werror 将警告作为错误处理
-x 指定语言
-g 产生调试信息
7.头文件作用:
(1)声明外部变量、函数和类
(2)定义宏,类型别名和自定义类型
(3)包含其他头文件
(4)借助头文件卫士防止头文件多次被包含而引发重定义的错误
8.gcc -I 指定头文件搜索附加路径
9.预处理指令
##连接宏内两个连续的字符串
#将宏参数扩展成字符串字面值
#error 产生错误
#warning 产生警告
#pragma GCC dependency <文件> 检查文件依赖关系
#pragma GCC poison <标识> 使标识产生错误
#pragma pack(1/2/4/8) 按指定字节补齐对齐
#line 指定行号
10预定义宏

1.BASE_FILE // 正在编译的源文件名
2.FILE // 所在文件名
3.LINE // 行号
4.FUNCTION // 函数名
5.func // 同__FUNCTION__
6.DATE // 日期
7.TIME // 时间
8.INCLUDE_LEVEL // 包含层数,从0开始
9.__cplusplus // C++编译器将其定义为1,
// C编译器不定义该宏

11环境变量
C_INCLUDE_PATH - C头文件的附加搜索路径,相当于gcc的-I选项
CPATH - 同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH - C++头文件的附加搜索路径
LIBRARY_PATH - 链接时查找静态库/共享库的路径
LD_LIBRARY_PATH - 运行时查找共享库的路径
12库
(1)链接静态库是将库中的被调用代码复制到调用模块中,而链接共享库是在调用模块中嵌入被调用代码在库中的相对地址
(2)静态库占空间,但是效率高,共享库占用空间小,易于修改但是效率略低
(3)静态库拓展名.a,共享库的缺省拓展名.so
13.创建静态库
(1)编辑源程序 .c/.h
(2)编译成目标文件 gcc -c xxx.c ->xxx.o
(3)打包成静态库文件 ar -r libxxx.a xxx.o

•ar指令:ar [选项] 静态库文件名 目标文件列表
-r - 将目标文件插入到静态库中,已存在则更新
-q - 将目标文件追加到静态库尾
-d - 从静态库中删除目标文件
-t - 列表显示静态库中的目标文件
-x - 将静态库展开为目标文件
14.调用静态库
(1)直接调用 gcc main.c libxxx.a
(2)通过LIBRARY_PATH环境变量指定库路径
export LIBRARY_PATH=$LIBRARY_PATH:./
gcc main.c -l库名
(3)通过gcc -L 选项指定库路径
gcc main.c -l库名 -L路径
15.可执行文件在运行阶段不依赖静态库
16.创建共享库
•1) 编辑源程序:.c/.h
•2) 编译成目标文件:gcc -c -fpic xxx.c -> xxx.o
•3) 链接成共享库文件:gcc -shared xxx.o … -o libxxx.so
17.调用共享库同静态库
18.运行可执行文件时依赖共享库
所以需要添加运行路径
运行时需要保证LD_LIBRARY_PATH,环境变量中包含共享库所在的路径。
19.动态加载共享库
(1)加载共享库
void *dlopen(const char *filename,int flag);
成功返回共享库句柄,失败返回NULL
(2)获取函数地址
void *dlsym(void *handle,const char *symbol)
成功返回函数地址
(3)卸载共享库
int dlclose(void *handle);
成功返回0,失败返回非零
(4)获取错误信息
char *dlerror(void);

记得链接时需要 -ldl
20.辅助命令
nm:产看目标文件,可执行文件,静态库共享库中的符号列表
ldd,查看可执行文件和共享库的动态依赖
strip:减肥
objdump:显示二进制模块中的反汇编信息。

发布了14 篇原创文章 · 获赞 84 · 访问量 2790

猜你喜欢

转载自blog.csdn.net/weixin_42617375/article/details/103744071