c++ - 为什么要先编译成目标文件?

标签 c++ c compilation fortran object-files

去年,我在一所研究型大学工作,开始使用 Fortran 进行编程。我之前的大部分经验都是使用 PHP 或旧 ASP 等网络语言,所以我是编译语句的新手

我正在修改两个不同的代码。

一个在创建可执行文件之前有一个从模块创建 .o 文件的显式语句(例如 gfortran -c filea.f90)。

另一个直接创建可执行文件(有时创建 .mod 文件,但不创建 .o 文件,例如 gfortran -o executable filea.f90 fileb.f90 mainfile。 f90)。

  • 是否有理由(可能是 Makefile 除外)一种方法优于另一种方法?

最佳答案

首先编译成目标文件称为单独编译。有很多优点,也有一些缺点。

优点:

  • 轻松将目标文件 (.o) 转换为库并稍后链接到它们
  • 许多人可以同时处理不同的源文件
  • 编译速度更快(在源未更改的情况下,您不会一次又一次地编译相同的文件)
  • 目标文件可以由不同的语言来源制成,并在以后的某个时间链接在一起。为此,目标文件只需使用相同的格式和兼容的调用约定。
  • 单独编译允许分发静态或共享的系统范围的库(操作系统库、语言标准库或第三方库)。

缺点:

  • 有一些优化(比如优化函数)编译器无法执行,链接器也不关心;然而,许多编译器现在包括执行“链接时间优化”的选项,这在很大程度上消除了这个缺点。但这对于系统库和第三方库来说仍然是一个问题,尤其是对于共享库(不可能优化掉每次运行时可能发生变化的组件部分,但是 JIT 编译等其他技术可能会缓解这种情况)。
  • 在某些语言中,程序员必须提供某种类型的 header 以供其他与该对象链接的人使用。例如,在 C 中,您必须提供 .h 文件才能与您的目标文件一起使用。但无论如何,这是一种很好的做法。
  • 在 C 或 C++ 等基于文本的语言中,如果更改函数原型(prototype),则必须在两个地方进行更改。一次在头文件中,一次在实现文件中。

关于c++ - 为什么要先编译成目标文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5283841/

相关文章:

c# - 以 ^Bo 开头的字符串

c++ - 如何处理 pthread_mutex_unlock() 错误?

c++ - 是否可以将数组数字作为函数执行?

c - 读取全局标志不适用于 CUDA 中的 CPU>GPU 数据交换

c - 我的 gcc 编译器给了我一个错误,显示为(函数)的类型冲突

c++ - 使用英特尔线程构建模块 : error operands to ? 进行编译:

C 函数,如宏 : expected an expression

c++ - 当前对象的引用存储在内存中的什么位置?

objective-c - 在 linux 中编译目标代码错误 (.text+0x20) : undefined reference to `main'

c++ - 为什么从 const 方法返回的 string& 无法编译?