Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 241|回复: 0
打印 上一主题 下一主题

简介:编译、链接、静态库那点事儿

[复制链接]

1304

主题

2106

帖子

8192

积分

认证用户组

Rank: 5Rank: 5

积分
8192
跳转到指定楼层
楼主
发表于 2024-12-22 00:20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://mp.weixin.qq.com/s/lFdTC69t-ZNK41dHCH-zng

编译一个 C 程序文件 非常简单,如果你用 MSVC 编译器,那命令行是:

> cl hello.c     //同目录下生成 hello.execl.exe 是你安装 VisualStudio 自带的,一般你在 "x64 Native Tools Command Prompt for VS 2022" 环境下就能直接用它。编译多个 C 程序文件 也可以用同样的方式,如下指令所示:

> cl hello.c allen.c   //同目录下生成 hello.exe当然,如果你工程庞大,项目文件众多,那就不可能在命令行下输入这么多文件名。此时,最原始的办法就是为你的工程编辑 NMake 配置文件,把你项目中需要编译的文件配置好,然后使用 nmake.exe 来编译程序。nmake.exe 也是装 VisualStudio 附带的,跟 cl.exe 在同一个目录下。目前几乎已经没有人使用 nmake.exe 这么原始的办法来编译程序了,如果你感兴趣,可以参考:https://learn.microsoft.com/zh-t ... rence?view=msvc-170编译 C++ 程序文件与编译 C 文件差异不大,但往往会加一个 /EHsc 参数,这个参数用于启用 C++ 异常处理的展开语义。编译器编译源文件生成可执行文件的步骤如下:
  • 编译源文件生成目标文件(.obj 文件)
  • 链接目标文件生成可执行文件(.exe 文件)

为什么要通过两个步骤完成这项工作呢?一个是 按需编译,工程有 A,B,C 三个文件,第一次编译时生成了a.obj,b.obj,c.obj 三个文件,当用户改动了 C 文件后,再次编译工程,此时只需要重新生成 c.obj 就可以了。不用再生成 a.obj 和 b.obj 了。另一个是 解析未定义的符号和引用 ,工程有 A,B,C 三个文件,假设 A 文件使用了 C 文件内定义的变量或方法,那么在链接目标文件时就会去解析这些引用。编译器还可以把一系列目标文件集合到一起,形成一个独立的文件,方便开发者复用这些目标文件,这个独立的文件就是静态链接库。生成静态库 的指令如下:

> lib /out:youStaticLib.lib a.obj b.obj c.obj这行指令把a.obj b.obj c.obj三个目标文件集合到一起,形成了静态库文件:youStaticLib.lib。lib.exe 也是装 VisualStudio 附带的,跟 cl.exe 在同一个目录下。你可以把这个静态库分发给想要使用它的开发者。这些开发者可以使用如下指令 链接这个静态库 。

> cl main.obj youStaticLib.lib /Fe"main.exe"此指令执行完成之后,开发者的 main.obj 目标文件就和你的 youStaticLib.lib 静态库文件链接到了一起,生成了 main.exe。最终产物只有 main.exe,开发者可以仅把 main.exe 分发给程序的最终使用者,不需要再携带你的 youStaticLib.lib 静态库文件,你的静态库youStaticLib.lib 已经成为了 main.exe 的一部分。如你所见:静态库可以让可执行程序便于分发 (相对于动态库而言)。但 静态库有两个显著的缺点:1:维护困难如果你是静态库的作者,你发现了一个BUG,修复后得到了新的静态库,此时所有使用你静态库的开发者都需要重新编译他们的程序、链接你的静态库,才能修复这个BUG。2:浪费空间如果你开发的静态库非常通用,很多程序都链接了你的静态库(可以简单的理解成这些程序都包含一份你的静态库的拷贝),这将占据非常多的用户空间(不仅仅是文件体积,还包括程序运行时占据的内存空间)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2025-2-23 05:55 , Processed in 0.055626 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表