总结学习 头文件 和 源文件 的关系以及存放

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章