指针函数与函数指针
结构体C和C++的区别
c中必须有typedef
例:typedef struct GifBean{
int current_frame;
int total_frame;
int *delays;
};
定义变量的时候 struct GifBean gifBean;
typedef struct GifBean{
int current_frame;
int total_frame;
int *delays;
}AA;
定义变量的时候 struct GifBean gifBean;
或者AA gifBean
typedef struct{
int current_frame;
int total_frame;
int *delays;
}AA;
定义变量的时候 AA gifBean
struct GifBean{
int current_frame;
int total_frame;
int *delays;
};
定义变量的时候 struct GifBean gifBean;
C++中如上的定义和C是一样的,不过C++可以不要typedef
struct GifBean{
int current_frame;
int total_frame;
int *delays;
};
GifBean gifBean;
struct GifBean{
int current_frame;
int total_frame;
int *delays;
}aa,bb,cc;
aa,bb,cc是定义的三个变量
编译流程:
预编译 对各种预处理命令进行处理gcc -E test.c -o test.i
编译 代码是否有语法错误,编译成汇编语言 gcc -S test.i -o test.s
汇编 把汇编代码文件生成二进制文件 gcc -c test.s -o test.o //-c gcc在生成机器码后停止
链接 就是将多个目标文件以及所需的库文件链接
生成可执行目标文件的过程 //gcc test.o -o test
./test
rm -rf test删除文件
直接编译成可执行文件 gcc -o test test.c
静态库:链接的时候已经把静态库拷贝到程序中以 .a结尾,执行不需要依赖静态库
更新发布比较麻烦
静态库的生成:
首先生成目标文件
gcc -c test.c -o test.o
使用ar命令将目标文件打包成静态库
ar rcs libtest.a test.o
r:表示更新或增加新文件
c: 创建一个库,不管是否存在
s:创建文档索引,加快编译时间
使用ar t libtest.a 查看静态库
动态库:动态库在链接阶段没有被复制到程序中,而是在程序运行中系统动态加载
系统只需载入一次动态库,不同的程序可以得到内存中相同动态库的副本
,因此节省了很多内存
静态库生成的过程;
首先生成目标文件
gcc -c test.c -o test.o
使用ar命令将目标文件打包成静态库
ar rcs libtool.a tool.o
链接静态库到main可执行文件
gcc -o main main.c -L. -ltool
./main 执行可执行文件
动态库生成的过程:
首先生成目标文件
gcc -c test.c -o test.o
生成动态库 创建与地址无关的代码 position independent code
gcc -shared -fPIC -o libtest.so test.o
编译可执行文件,链接动态库
gcc -o main main.c -L. -ltool//-l要链接的库 -L编译程序按照-L指定的路径去寻找库文件
//当动态库和静态库同名的时候,gcc会优先加载动态库
ls -lh 查看文件详情
ldd 查看可执行文件依赖了哪些库
vdso linux内核提供的虚拟so
libc.so 核心库
linux 下的动态库链接器
把当前目录设置到环境变量
LD_LIBRARY_PATH=. ./main //指定查找共享库,查找动态库除了默认路径以外的其他路径,报错的原因是他在系统的默认路径下找不到libtool.so,
因为我们没有把当前目录设置到系统环境变量中,所以报错
makefile 自动化编译脚本 告诉make命令如何编译
显示规则:
隐晦规则:比较简略的书写makefile
变量定义:变量都是字符串
文件指示:
注释:只有行注释 #
target 目标文件
prerequisites:依赖文件,即要生成哪个target所需要的文件或其他target
#!/bin/bash 引入 bin bash shell脚本第一行必须的
echo 输出一个变量
shell是弱语言
PWD 代表当前路径
shell 运行在linux系统上
shell 就是命令的集合
能独立的编译任意的第三方库,并将它打包到apk中
局部变量 系统环境变量(输入参数)
seq 系统脚本
expr命令 两数相加
$0 当前程序的名称
$n 程序的输入参数 n=1 第一个参数 n=2第二个参数
$* 所有的输入参数
$# 输入参数的个数
$? 命令执行的状态 一般返回0 代表成功 上一个命令是否执行成功
#!/bin/bash
i=0
while((i<100))
do
echo “数字 $i”
i=expr $i + 1
done
#!/bin/bash
i=0
while [[ $i -lt 100 ]]
do
echo “数字 $i”
i=expr $i + 1
done
读文件
#!/bin/bash
while read line
do
echo $line
done</root/file.txt
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a;
动态库是,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,后缀为.so
Makefile描述了整个工程的编译、连接等规则哪些文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、
如何产生我们想要的可执行文件。使用Makefile,整个工程都可以完全自动化编译
实现C++与C及其它语言的混合编程