编译过程
预处理.i , 编译.o , 汇编.s/.S , 链接.out(可执行程序)
动态库 .so
静态库 .a
预处理: 头文件的包含, 宏定义的展开,编译条件的选择
编译:经过词法分析,语法分析,把源代码翻译成中间语言,及汇编语言
汇编:把汇编代码翻译成机器代码
链接:是一个符号和地址的绑定的过程。把符号信息转换成可执行文件中的虚拟地址等。
动态链接:通过动态符号找到内存地址。
静态链接:链接后,重定位到绝对的虚拟内存地址,以便在运行时读取到该地之中的信息。
静态库
1、创建静态库
gcc -c hello.c
ar -r libhello.a hello.o
2、使用静态库
gcc test.c -lhello -L.
gcc test.c libhello.a -L.
编译参数说明
-Ipath -Lpath -lname
-Ipath
指定的头文件查找,然后到默认的系统头文件查找:
/usr/local/include
/usr/include
-lname
指定库的名字,libname.so(去掉lib,去掉.so)
-Lpath
库搜索路径
3、运行程序
不需要指定库的搜索路径。
动态库
1、创建动态库
gcc -shared hello.c -o libhello.so
2、使用动态库
gcc test.c -lhello -L.
3、运行程序
dyld: Library not loaded: libhello.so
Reason: image not found
需要指定库的搜索路径
LD_LIBRARY_PATH
export LD_LIBRARY_PATH=xxxxpath:$LD_LIBRARY_PATH
/etc/ld.so.conf指定的动态库搜索路径
默认的动态库搜索路径:
/lib
/usr/lib
查询二进制文件所依赖的库列表
gun linux上命令是ldd,freebsd drawin上是otool -L