一、.c文件到app的过程
二、执行选项
gcc -E -o hello.i hello.c //预处理:展开宏,查看头文件
gcc -S -o hello.s hello.i//编译:形成汇编码
gcc -c -o hello.o hello.s//汇编:形成机器码
gcc -o hello hello.o//链接
三、形成过程
四、语法错误,函数申明定义检查时间
编译时(-S选项)会检查语法错误和函数是否申明,不会检查函数是否定义
链接时会检查函数定义
五、头文件查找路径
#include <stdio.h>
<>表示去系统,工具链指定的目录查找头文件
#include “sub.h”
“”在当前目录查找头文件
六、比较有用的选项
gcc -E main.c // 查看预处理结果,比如头文件是哪个
gcc -E -dM main.c > 1.txt // 把所有的宏展开,存在 1.txt 里
gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依赖文件 abc.dep,后面 Makefile 会用
echo 'main(){}' | gcc -E -v - // 它会列出头文件目录、库目录 (LIBRARY_PATH)
七、生成动态库和静态库
静态库:
gcc -c main.o main.c
gcc -c sub.o sub.c
ar crs libsub.a sub.o sub2.o sub3.o(可以使用多个.o 生成静态库)
gcc -o test main.o libsub.a
动态库:
gcc -c main.o main.c
gcc -c sub.o sub.c
gcc -shared -o libsub.so sub.osub2.o sub3.o(可以使用多个.o 生成动态库)
gcc -o test2 main.o libsub.so
通常使用gcc -o test2 main.o -lsub链接,可简写库名称,但此时会报错找不到库,因为默认寻找库是在/lib或者/usr/lib
此时需用
gcc -o test2 main.o -L ./ -lsub
使用-L指定库的目录,使用-l指定库文件目录
八、运行
运行./test会报错找不到库,因为库默认是在/lib或者/usr/lib
两种解决办法:
1.将库放到lib里面
2.指定路径export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库路径
第二种方法会先在LD_LIBRARY_PATH找,找不到后再在(动态库路径)找