c++ - 我可以将一个编译生成的目标文件链接到另一个编译生成的目标文件吗?

标签 c++ compiler-construction linker object-files

更具体地说,假设两个编译器都在同一平台(操作系统 + 指令集)上。但是,其中一个目标文件是由依赖于编译器的代码生成的。另一方面 - 代码是面向对象的并且尊重封装。

我需要这个用于我正在制作的一种框架。目标平台是 GCC 和 Java 虚拟机所在的任何系统。实际上,该框架将在每个平台上编译。使用框架用户的编译器由他决定。

最佳答案

只要它们使用相同的目标文件格式并针对相同的机器指令集,您就应该能够链接它们。例如,假设您有两个 C 编译器,每个编译器都有自己的专有语言扩展。您编译两个不同的文件,一个使用编译器 A,另一个使用编译器 B。每个源文件都使用其各自编译器的语言扩展。只要两个编译器都设置为针对相同的平台和体系结构,例如 Linux 上的 i386 指令集,那么您应该能够将文件链接到一个可执行文件中。

See this list of object file formats on wiki .

这可能也是您感兴趣的:

UNIX tools for exploring object files

编辑

根据这篇文章“C++ Standard Library ABI”,有一个行业标准 C++ ABI,您应该能够链接符合该标准的任何编译器的目标文件。你可以在这里看到这个标准:

Itanium C++ ABI

This document was developed jointly by an informal industry coalition consisting of (in alphabetical order) CodeSourcery, Compaq, EDG, HP, IBM, Intel, Red Hat, and SGI...

In this document, we specify the Application Binary Interface for C++ programs, that is, the object code interfaces between user C++ code and the implementation-provided system and libraries. This includes the memory layout for C++ data objects, including both predefined and user-defined data types, as well as internal compiler generated objects such as virtual tables. It also includes function calling interfaces, exception handling interfaces, global naming, and various object code conventions.

因此,只要您针对相同的指令集、目标文件格式并使用标准 C++ ABI(现在是 gcc/g++ 中的默认设置)就应该没问题,当然假设标准 C++ ABI 实际上是标准的并由在 Linux 上运行的大多数现代 C++ 编译器正确实现(这似乎是您的目标平台)。

编辑 2

你应该看看这篇 SO 帖子:

GCC vs MS C++ compiler for maintaining API backwards binary compatibility

Microsoft 似乎没有遵循任何关于其 C++ ABI 的一致标准(Itanium 或其他),因此如果您使用适用于 Windows 的 gcc 进行编译,则可能会出现问题。

你可能还想看看这两篇文章:

Policies/Binary Compatibility Issues With C++

Some thoughts on binary compatibility

您可以限制您的用户使用支持 Itanium ABI 的编译器,但这取决于您的目标受众。

关于c++ - 我可以将一个编译生成的目标文件链接到另一个编译生成的目标文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5728116/

相关文章:

c++ - 无法使用 FFmpeg 编码单帧 h264 (.mp4) 视频。不存在视频流

C++ Winsock - 接受()

c++ - 我对值初始化的尝试被解释为函数声明,为什么不 A a(());解决这个问题?

compiler-construction - 是否有适用于 x86 或 x86_64 的 lolcode 编译器?

c++ - 如果链接时启用 "-ffast-math"会发生什么?

c++ - 未解析的外部符号 _DEVPKEY_Device_BusReportedDeviceDesc

C++ 什么时候编译类目标文件?

java - 关于java的5个问题

C++ include .h 也包含同名的 .cpp 吗?

visual-studio-2010 - VS2010如何设置_ITERATOR_DEBUG_LEVEL?