代码编译学习笔记:gcc

编译过程

预处理.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容