1.源码到而二进制主要三阶段:
预处理->编译->链接
2.实际例子:
目录结构如下图所示
│ makefile
│
├─bin
│ main.exe
│
├─include
│ libtmp.h
│
├─lib
│ libtmp.dll
│
└─src
main.c
temp.c
temp.h
.dll文件为windows下的动态链接库
仅预处理:gcc -E
仅转为汇编源码:gcc -S
仅编译:gcc -c
默认三步全做:gcc
预处理只分别处理每个文件
编译期间仅考虑声明的完整性
若编译为动态链接库,那就还要求声明对应定义的完整性
若编译为可执行文件,那就还要求有main
若编译为静态链接库,那就仍然只考虑声明
工作目录为makefile所在目录
main.c想要加入temp.h那么
#include"./temp.h"
使用相对路径
如果想要
#include<libtmp.h>
编译使用
gcc -I./include 或者 gcc -Iinclude
上面“-”后面是大写的i
大写的I,大写L,小写l,大写D,后面都紧随一个用于此选项的参数,并且可以和这个参数之间不空格
用-I加入的是一个目录,临时添加头文件查找目录,优先级高于系统默认目录
gcc -c 这个阶段,链接还可以-L也可以类似的添加一个目录,为链接库搜索目录,优先级同样高于系统目录(静态或者动态都算)
windows下动态库libxxx.dll
unix下动态库libxxx.so
windows/unix下静态库libxxx.a
windows下gcc -shared可以生成动态库,比如:
gcc -shared -fPIC libxxx.dll tmp1.o tmp2.o tmp3.o
unix下ar 可以生成动态库,比如:
ar -cqs libxxx.a tmp1.o tmp2.o tmp3.o
ar命令行参数依次为:
选项 目标文件 源文件
使用的时候可以省略ib两个字母,比如:
学习unp的时候,用到的编译选项:
gcc xxx.c -o xxx -lunp
-lunp -lpthread
其实是-linunp -libpthread
后缀名.dll .so .a都需要省略
ps:libunp是我们下载源码后,按照使用流程编译的,libpthread是Unix自带的
选项-lunp -lpthread均不跟路径(已经添加到默认路径了)
选项-L+路径,手动临时添加路径,如目录:
-Llib添加lib目录
如果想使用libtmp.dll,就需要编译的时候:
gcc -c src/main.c -o main.o -Iinlcude
gcc main.o -o bin/main.exe -Llib -ltmp 添加lib为动态链接库目录,使用libtmp.dll