GCC编译步骤及静态库动态库制作GCC
GCC编译的4个步骤
-D:编译的之后添加宏定义
//测试gcc -D选项,编译的时候指定宏定义.
#include<stdio.h>
int main(int argc, char const *argv[])
{
#ifdef DEBUG
printf("hello\n");
#else
printf("world\n");
#endif
#ifdef WEATHER
printf("sun\n");
#else
printf("rainy\n");
#endif
return 0;
}
⼀个宏定义使⽤⼀个-D选项,不能空格,或者逗号连着写。
-E看看预处理之后的⽂件啥样:
//hello.h内容
void printf_hello()
{
printf("hello\n");
}
//hello.c内容
#include<stdio.h>
#include"hello.h"
int main(void)
{
printf_hello();
return 0;
}
gcc -E hello.c -o hello.i,打开hello.i⽂件后可以看到把include.h和hello.h的内容都包含进来了。include.h内容太多,这⾥没截出来。
GCC编译参数:
-I:指定头⽂件所在⽬录位置 ,头⽂件和源⽂件在同⼀路径,不⽤指定头⽂件位置。
-L:指定库⽂件所在⽬录,
-l(⼩写L):指定库⽂件,因为-L只制定了库⽂件路径,没有指定名称,使⽤-l指定名称。-l和库名连着写,省略lib和.a或者.so。
-o:指定⽣成的⽂件名
-E:预处理
-S:预处理,编译,⽣成汇编程序
-c:预处理,编译,汇编,把前⾯的⼏步都做了。得到⼆进制⽂件。
-g:编译时添加调试语句,加了-g选项之后,可以使⽤gdb进⾏调试。加了-g后⽣成的可执⾏⽂件包含了调试信息,⽐不加⽂件要⼤⼀些。-w:忽略所有警告。
-Wall:显⽰所有警告信息,把不重要的警告也显⽰出来
-On:n为0-3,编译优化,n越⼤优化的越多。优化的越多可能影响越⼤。
-D:向程序中“动态”注册宏定义
Linux系统编程:
linux下gcc编译的四个步骤什么是系统调⽤:操作系统实现并提供给外部应⽤程序的编程接⼝,应⽤程序与系统之间数据的桥梁。
内核:核⼼程序
系统调⽤(内核提供的函数),服务上层应⽤。
Linux内核源码中其实没有write函数,有sys_write函数,write是对sys_write的浅封装,wrire代码和sys_write代码没啥区别,习惯上⽤write函数就说系统调⽤。
open:
头⽂件unistd.h
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:⽂件描述符,⼀个整数
mode:⽂件不存在时,指定⽂件的权限;⽂件存在时,mode失效;mode为8进制数,例如0777,0开头表⽰⼋进制。
创建⽂件时,⽂件权限还收umask影响,⽂件权限=mode&~umask
open常见错误:
1.打开⽂件不存在
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
int main(void)
{
int fd = open("",O_RDONLY);
printf("fd=%d,errno=%d:%s\n",fd,errno,strerror(errno));
perror("open");
return 0;
}
fd=-1,errno=2:No such file or directory
open: No such file or directory
这个时候fd就是-1了。
都是O_RDONLY等定义在头⽂件fcntl.h中,但是我了半天没有到,fcntl.h中包含了头⽂件bits/fcntl.h,⼜说在bits/fcntl.h,我看了也没有,bit/fcntl.h⼜包括了bits/fcntl-linux.h,终于到了。
疑问:怎么打开⼀个⽬录⽂件,打开之后怎么对⾥⾯的⽂件进⾏操作?
vim中查看函数帮助⽂档:
命令模式下在函数的地⽅按下K,默认显⽰第⼀种类型的帮助⽂档,当要查看系统调⽤时,使⽤2K。
close:
int close(int fd);
静态库和动态库
程序库可以分为静态库(static library)和共享库(shared object)
共享库就是动态库
静态库:源程序在编译时就把静态库包含了进来,⽣成⼀个可执⾏⽂件。每⼀个包含静态库的源程序都需要把静态库拷贝⼀份,所以⽐较占空间。
动态库:源程序⽣成可执⾏⽂件后,在运⾏时调⽤动态库。程序在内存中运⾏时,动态库也加载到内存中,多个程序只需⼀个动态库就可以,不过执⾏速度相对静态库要慢⼀些。
静态库:对空间要求低,对时间要求⾼的程序
动态库:对时间要求低,对空间要求⾼的程序。
创建静态库
静态库⽤的较少,
ar rcs libmylib.a file.o
libmylib.a:静态库名,⼀般以lib开头,以.a结尾静态库制作步骤:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论