Makefile
在多文件编译时,如果少了某些文件,则可能会出现错误提示:未定义符号。
预编译时,会将include替换掉,将指定的.h文件的内容全部复制到当前的.c文件中。
比如有一个项目,项目结构是这样
1 | Object(目录) |
在这个情况下使用gcc是不合理的,这个时候就要使用Makefile文件来编译。
写几个样例测试下
原来使用这个来编译
如果修改其中一个文件代码,你就得编译所有的文件。
这时候写一个Makefile文件
可执行文件main需要其他几个.o文件,并通过gcc -o来生成.o文件,这时候这些.o文件得通过.c文件来生成,并通过gcc -c来生成.o文件
然后在通过make文件就可以一步完成了。
当你修改其中一个文件后,再make的时候,你会发现只会返回关于你修改的文件的编译。
如果想重新编译的话只需要执行一次make clean,然后从新make就可以了
这些只是最基本的写法
下面贴上普通的写法
库文件
将用户写好的程序打包成一个整体,当其他模块或者其他用户使用时,只需要这个库文件就ok。
1 | libc.so->stdio.h string.h math.h rand.h time.h |
静态库
Windows:.lib
Linux:.a
生成:1、将所有的源代码文件(不能有带main方法的源文件)编译生 成中间文件(.o)
2、使用命令 ar crv libxxxx.a 所有的中间文件
使用:gcc -o main main.c -L库的路径 -l库的名称(xxxx)
如果没有给库的路径,则会去默认路径下查找:/lib /usr/lib
动态库(共享库)
共享库是在程序运行时,由操作系统单独加载执行。共享库是一个可执行文件(不能单独执行)
用过环境变量来设置系统加载动态库的搜索路径:LD_LIBRARY_PATH
Windows:.dll
Linux:.so
生成:gcc -shared -fPIC -o libxxxx.so 所有功能代码的源文件
使用:和静态库一样。