【问题标题】:What is the difference between a static library and a command line application?静态库和命令行应用程序有什么区别?
【发布时间】:2026-02-24 05:00:02
【问题描述】:

我知道命令行应用程序是独立的,可以从 shell 调用。另一方面,静态库由其他程序链接。

但实际上两者之间的区别是什么?它是具有不同接口的相同二进制文件吗?还是完全不同?

【问题讨论】:

  • 什么?这实际上是在比较苹果和橙子。
  • 不一定需要外壳来运行/启动(任何)程序。
  • 不知道为什么反对票。相同的代码既可以编译成独立的应用程序,也可以编译成静态库。我试图了解它们之间的区别。

标签: static-libraries executable


【解决方案1】:

这是完全不同的东西。独立应用程序具有可以直接执行的二进制产品。然而,静态库不能自行执行。独立应用程序可以链接到一组静态库,在这种情况下,应用程序可以访问这些库中定义的符号。

举个例子,你可以创建一个静态库,它在helper.h 中声明以下函数并在helper.c 中定义它:

int func() {
    printf("hi\n");
}

当你构建这个库时,你最终会得到像helper.a 这样的东西,它不能独立执行(它没有int main()),但可以被一个或多个独立应用程序链接到。链接后,这些应用程序可以简单地包含helper.h 并调用func(),就好像它们已经实现了func()

最后,在两者之间进行选择取决于您要达到的目标。您是否正在尝试创建一个可供多个应用程序链接和使用的工具?然后使用静态库。

【讨论】:

  • 此处“一旦链接,这些应用程序可以简单地包含 helper.h 并调用 func(),就好像它们已经实现了 func()。”顺序错误。首先包括头文件,(然后编译)然后链接库,然后才运行最终调用func()的程序。
  • 没错。根据他的问题,我假设 OP 正在使用 Xcode,其中链接是通过构建设置完成的。
  • "链接是通过构建设置完成的" 这将如何改变必要的顺序?链接是构建过程中的最后一个步骤。
  • @alk 顺序总是先编译,后链接;正如你提到的。 Xcode 中的链接阶段是在编译源代码之后。无需明确指定步骤。