Makefile and 库文件

Makefile

在多文件编译时,如果少了某些文件,则可能会出现错误提示:未定义符号。

预编译时,会将include替换掉,将指定的.h文件的内容全部复制到当前的.c文件中。

比如有一个项目,项目结构是这样

1
2
3
4
5
Object(目录)
Database(目录):数据库操作
Core(目录):项目核心代码 100个.c文件
DateData(目录):基础业务逻辑 1000个.c文件
Inter(目录):网络部分的代码

在这个情况下使用gcc是不合理的,这个时候就要使用Makefile文件来编译。

写几个样例测试下

原来使用这个来编译

如果修改其中一个文件代码,你就得编译所有的文件。

这时候写一个Makefile文件

可执行文件main需要其他几个.o文件,并通过gcc -o来生成.o文件,这时候这些.o文件得通过.c文件来生成,并通过gcc -c来生成.o文件

然后在通过make文件就可以一步完成了。

当你修改其中一个文件后,再make的时候,你会发现只会返回关于你修改的文件的编译。

如果想重新编译的话只需要执行一次make clean,然后从新make就可以了

这些只是最基本的写法

下面贴上普通的写法

库文件

将用户写好的程序打包成一个整体,当其他模块或者其他用户使用时,只需要这个库文件就ok。

1
2
libc.so->stdio.h string.h math.h rand.h time.h
libstdc++.so--->STL

静态库

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 所有功能代码的源文件

使用:和静态库一样。