我正在尝试编译一个需要GTK头文件的简单ANSI C程序。
我知道在使用GCC编译时如何将源代码与gtk.h链接。
我的问题是考虑到GTK头文件丢失,为什么gedit(GTK lib)等应用程序在我的系统上运行?据推测,Gedit是在一个拥有GTK库的系统上编译的。但是为什么Gedit在执行期间不需要我的系统上的头文件?
作为编译程序的Java程序员,类文件总是必须与主可执行文件打包在一起。我还需要在目标系统上安装JVM。
感谢您的回复。
答案 0 :(得分:5)
但为什么Gedit在我的系统中不需要头文件 执行?
仅在预处理阶段中需要头文件。一旦预处理器完成后,编译器就永远不会看到它们。显然,目标系统不需要它们来执行(同样的方式.c文件也不需要)。
你可能正在考虑图书馆,你是对的。确实:如果一个程序是动态链接的,并且目标环境没有必要的库,那么在正确的位置,使用正确的版本它将无法运行。确保它在大多数系统上运行的一种方法是静态链接东西,但这也会使你的可执行文件膨胀并使内存使用更少。
此外,我还需要在目标系统上安装JVM。
嗯,对于C,不需要这样的东西,因为一旦你编译它就会得到本机代码。本机代码与您从java获得的中间代码(字节代码)非常不同。没有必要像解释器这样的东西:你只需将二进制内容提供给CPU,它就可以做到。
答案 1 :(得分:4)
可执行文件所需的所有内容都是在编译后构建到可执行文件中的。在C中,头文件在引用时直接包含在源文件中,然后进行编译。