【发布时间】:2021-09-20 17:50:20
【问题描述】:
假设您使用的是 C11,并且您需要使用用 C17 编写的库(静态或动态)。您可以将库编译为目标文件,然后将它们与您的程序链接吗?我的意思是,目标文件只是可执行文件(它们是机器代码,还是二进制?),除非您需要在它们可执行之前链接它们。我刚才写的东西有什么疯狂?
顺便问一下,没有任何依赖的对象文件是可执行的吗?
【问题讨论】:
标签: c linker object-files
假设您使用的是 C11,并且您需要使用用 C17 编写的库(静态或动态)。您可以将库编译为目标文件,然后将它们与您的程序链接吗?我的意思是,目标文件只是可执行文件(它们是机器代码,还是二进制?),除非您需要在它们可执行之前链接它们。我刚才写的东西有什么疯狂?
顺便问一下,没有任何依赖的对象文件是可执行的吗?
【问题讨论】:
标签: c linker object-files
为了让一个例程能够调用另一个例程,它们需要以兼容的方式传递和接收参数。计算平台通常有一个应用程序二进制接口 (ABI),说明如何传递参数。用 C、C++、FORTRAN、PL/I 或其他语言编写的例程可以相互调用,只要它们使用相同的 ABI。使用不同 C 标准编译的例程可以相互调用,只要它们使用相同的 ABI。
除了传递参数之外还有兼容性问题。一个版本的库可能有一些需要指定长度的特性。下一个版本可能需要指定长度和宽度,或者它可能具有所需的长度和可选的宽度。为库的一个版本编写的程序可能无法使用另一个版本,因为它没有传递库所需的参数,即使它传递参数的方式符合 ABI。
如果您有一个库和您自己的程序的源代码,并且您使用相同的编译器编译它们,只需一个 C 2017/2018 开关和另一个 C 2011 开关,如果您正确调用库例程。
对象文件通常是不可执行的,因为它们的格式与可执行文件不同。有不同的对象格式,并且,就理论上可能的情况而言,如果没有实际实践的话,有人可以设计一个不包含依赖项的可执行的对象文件格式,或者可以设计一个读取对象文件格式并加载它的程序加载器再次执行,如果它没有依赖项。不过,在这方面,您可以通过编译、链接和加载程序加载器来执行源文件。
【讨论】: