在Linux下写项目总会碰见这样的情况------哎呀~~这个项目的文件需要好多文件一起编译,这么多,眼睛快花了。我去!少编译一个,又要重新打了,心态炸了。。。。 //(T o T)//
makefile文件目的是为了方便工程管理,当面临你写了很多个源文件的时候这个时候为了简化你的大量重复编译而设计出来的途家, 再者很多项目就编译就要很长时间,改3次代码编译三次一天就过去了,啥也没干。而一个make 命令,改代码再编译时,它会根据源文件的最后修改时间来判断此文件需不需要重新编译,大大提高工作效率.
不多说上图
编译完上述文件后我们只要输入make命令,我们就能得到编译的各个文件,然后输入make clean 就可以删除编译的中间文件。
make命令会默认在此目录找 makefile/Makefile 文件,如果我们写的 makefile文件名字叫做main,要运行只需要加个参数就行,例如:
make -f main 这样时是等价的.
在下面说一说makefile文件的简化以及一些补充:
库文件分为 静态库 是和 动态库(共享库):
1)静态库(Linux上为 .a Window上为 .lib )
1.是中间文件的集合,在链接阶段直接将库中的内容合并到最终的可执行文件中,就是说,链接完成后,生成的可执行文 件的执行不再依赖静态库
2.静态库生成的命令: gcc -c *.c (先将.c文件生成对应的.o文件)
ar crv libxxxx.a *.o (其中xxxx是生成的库名,前面的 lib和后面的 .a必须有 )
3.静态库的使用:
第一种: gcc -o run main.c -L(库路径) -l(库名)
例如: gcc -o run main.c -L/home/stu/lib -lList
第二种: gcc -o run main.c 路径/libxxxx.a
例如: gcc -o run main.c /home/stu/lib/libList.a
2)动态库(Linux上为 .so Window上为 .dll )
1.动态库是 不可单独执行的可执行文件,链接阶段只在可执行文件中设置使用的的库,运行时由操作系统加载到内存上 执行,因此生成的可执行文件在执行时要依赖动态库的存在
2.动态库生成的命令:
gcc -shared -fPIC -o libxxxx.so *.c
3.动态库的使用: 同静态库一样
4.当链接完成后执行时会有问题,问题出现的原因是: 动态库需要由操作系统加载到内存上,但我们自己写的库操作系统 找不到,因此依赖动态库而的程序不能直接运行,会出错! 解决这个问题有以下两种方案:
<1>将动态库拷贝到 /lib 或 /usr/lib 目录下,但是这个操作需要 root 权限,不建议这么做
<2>设置环境变量 export LD_LIBRARY_PATH=动态库所在的绝对路径
vi /home/.bashrc //进入到.bashrc这个配置文件中
然后在文件的最后加上一句 export LD_LIBRARY_PATH=动态库所在的绝对路径
5. ldd run //查看可执行文件run中所加载的动态库
动态库和静态库的区别
1.同样的程序,使用静态库比使用共享库程序更大
2. 静态库在编译链接是,就加入到了可执行程序中,共享库是在运行程序后动态装载
3.目标主机没有静态库,程序可以运行,没有共享库,运行不了
4.共享库升级后,程序不需要重新编译吗可以直接被使用,静态库需要重新编写程序,链接新方法