【问题标题】:How compiled c programs execute when my system is missing GTK header files?当我的系统缺少 GTK 头文件时,编译后的 c 程序如何执行?
【发布时间】:2013-02-14 21:53:32
【问题描述】:

我正在尝试编译一个需要 GTK 头文件的简单 ANSI C 程序。

我知道在使用 GCC 编译时如何将源代码与 gtk.h 链接。

我的问题是,考虑到 GTK 头文件丢失,我的系统上如何运行诸如 gedit (GTK lib) 之类的应用程序?据推测,Gedit 是在具有 GTK 库的系统上编译的。但是为什么 Gedit 在执行过程中不需要我系统上的头文件呢?

作为编译程序的 Java 程序员,类文件总是必须与主可执行文件一起打包。我还需要在目标系统上安装 JVM。

感谢您的有用回复。

【问题讨论】:

  • 头文件是(部分)源代码。 JVM 世界之外的class 文件的等价物是共享库和可执行文件。
  • 请注意,您不是针对头文件链接;你是包括它。链接是对象文件发生的事情以解决丢失的符号。
  • 事实上,您甚至不需要头文件来编译应用程序——您可以编写自己的声明,只要它们与您链接的定义相匹配。
  • 不需要反对,这是一个不错的问题。

标签: c gtk


【解决方案1】:

但是为什么 Gedit 在我的系统上不需要头文件 执行?

仅在预处理阶段需要头文件。一旦预处理器完成了它们,编译器甚至不会看到它们。显然,目标系统也不需要它们来执行(同样不需要 .c 文件)。

您可能正在考虑图书馆,您是对的。确实:如果程序是动态链接的,并且目标环境没有必要的库,在正确的位置,使用正确的版本它不会运行。确保它可以在大多数系统上运行的一种方法是静态链接内容,但这也会使您的可执行文件膨胀并减少对内存的使用。

我还需要在目标系统上安装 JVM。

好吧,对于 C 来说,不需要这样的东西,因为一旦你编译它,你就会得到 本机代码。本机代码与您从 java 获得的中间内容(字节码)非常不同。不需要像解释器这样的东西:你只需将二进制文件提供给 CPU,它就会完成它的工作。

【讨论】:

    【解决方案2】:

    可执行文件需要的头文件中的所有内容在编译时都内置到可执行文件中。在 C 中,头文件只是在引用并编译时直接包含在源文件中。

    【讨论】:

    • 感谢所有回答我问题的人。
    猜你喜欢
    • 2020-08-06
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2015-11-22
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多