泉州网站设计制作上海影城改造升级
泉州网站设计制作,上海影城改造升级,国内最新新闻,wordpress电子商城主题一文带你深入了解链接 文章目录一文带你深入了解链接链接在做什么#xff1f;链接方式1. 静态链接#xff08;Static Linking#xff09;特点工作原理优点缺点生成静态库2. 动态链接#xff08;Dynamic Linking#xff09;特点工作原理优点缺点生成动态库静态链接 vs 动态…一文带你深入了解链接文章目录一文带你深入了解链接链接在做什么链接方式1. 静态链接Static Linking特点工作原理优点缺点生成静态库2. 动态链接Dynamic Linking特点工作原理优点缺点生成动态库静态链接 vs 动态链接 对比链接过程详细图解示例常见问题1. 为什么需要 -fPIC2. 运行时找不到动态库怎么办3. 静态链接的程序能使用动态库吗总结总结这是关于编译链接过程和链接方式的核心知识点。以下是对这些内容的详细解释和补充链接在做什么**链接Linking**是将多个目标文件.o或.obj和库文件组合成一个可执行文件的过程。它的主要工作包括符号解析Symbol Resolution将每个目标文件中引用的符号函数名、全局变量名与其定义关联起来例如hello.o中调用了printf链接器需要找到printf的实现位置重定位Relocation为代码和数据分配最终的虚拟内存地址修改代码中的地址引用使其指向正确的内存位置合并段Section Merging将所有目标文件的相同段如.text、.data、.bss合并到一起简单来说链接器就像拼图高手把散落各处的代码碎片拼成完整的可执行文件。链接方式1. 静态链接Static Linking特点在编译时将库的代码直接复制到可执行文件中生成的可执行文件不依赖外部库文件可以独立运行文件体积较大因为包含了库代码工作原理hello.o (调用 printf) libc.a (包含 printf 实现) → 静态链接 → hello (包含 printf 代码)优点运行时无需依赖外部库部署简单程序启动速度快无需动态加载库版本固定不会因系统库升级导致问题缺点可执行文件体积大每个程序都包含同一份库代码内存浪费多个程序运行时同一份库代码在内存中有多份副本库升级需要重新编译程序生成静态库# 创建静态库ar rcs libmylib.a file1.o file2.o# 静态链接使用gcc main.o -L.-lmylib-oprogram2. 动态链接Dynamic Linking特点推迟链接到程序运行时可执行文件中只记录需要哪些库如libc.so程序启动时操作系统动态加载共享库到内存工作原理hello.o (调用 printf) → 动态链接 → hello (记录 需要 libc.so) 运行时hello libc.so → 完整程序优点可执行文件体积小不包含库代码内存共享多个程序使用同一份库代码物理内存只存一份库升级只需替换.so文件无需重新编译程序缺点运行时依赖库文件缺少库则无法运行“DLL hell” 问题程序启动稍慢需要动态加载和链接库版本兼容性问题可能引发崩溃生成动态库# 创建动态库gcc-fPIC-sharedfile1.c file2.c-olibmylib.so# 动态链接使用gcc main.o -L.-lmylib-oprogram# 运行时需要告诉系统库位置exportLD_LIBRARY_PATH.# Linux./program静态链接 vs 动态链接 对比特性静态链接动态链接链接时机编译时运行时文件大小大包含库代码小只记录依赖运行时依赖无需要库文件存在内存占用多份库副本库代码共享升级灵活性需重新编译替换库文件即可启动速度快稍慢加载库兼容性风险无库版本固定有库版本不兼容链接过程详细图解源代码 (*.c/*.cpp) ↓ 编译Compiler 目标文件 (*.o) ← 每个源文件独立编译 ↓ 链接Linker 可执行文件 / 库文件 链接器处理 1. 将所有 .o 文件合并 2. 解析符号引用找到每个函数/变量的定义 3. 分配内存地址 4. 生成最终可执行文件示例# 编译生成目标文件gcc-chello.c-ohello.o gcc-cworld.c-oworld.o# 静态链接gcc hello.o world.o-ohello_static# 动态链接默认gcc hello.o world.o-ohello_dynamic# 查看依赖的动态库ldd hello_dynamic# Linuxotool-Lhello_dynamic# macOS常见问题1. 为什么需要 -fPICPICPosition Independent Code位置无关代码动态库需要能被加载到内存的任意地址不能使用绝对地址不加 -fPIC 编译的动态库可能无法正确共享2. 运行时找不到动态库怎么办# Linux 解决方法exportLD_LIBRARY_PATH/path/to/libs:$LD_LIBRARY_PATH# 或修改 /etc/ld.so.conf 后运行 ldconfig# Windows将 DLL 放在程序目录或系统PATH中3. 静态链接的程序能使用动态库吗不能。一个程序要么完全静态链接要么依赖动态库。但可以混合程序自己链接动态库动态库内部可能静态链接其他库总结概念解释链接将目标文件和库合并成可执行文件的过程静态链接库代码直接嵌入可执行文件独立运行体积大动态链接运行时加载库体积小内存共享依赖外部库gcc hello.o -o hello链接 hello.o 和 C 标准库生成可执行文件 hello理解链接过程对排查编译错误、优化程序大小、解决运行时依赖问题非常有帮助。总结这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持作者wkm是一名中国矿业大学(北京) 大一的新生希望得到你的关注如果可以的话记得一键三联