静态库版本独立吗?

Are static libraries version independent?

假设您正在使用 C11,并且您需要使用用 C17 编写的库(静态或动态)。你能把这个库编译成目标文件,然后 link 那些和你的程序一样的文件吗?我的意思是,目标文件只是可执行文件(机器代码, 或二进制文件?),除非您需要 link 它们才能执行。我刚刚写的东西有什么疯狂吗?

顺便问一下,没有任何依赖的目标文件是否可执行?

为了使一个例程能够调用另一个例程,它们需要以兼容的方式传递和接收参数。计算平台通常有一个应用程序二进制接口 (ABI),说明如何传递参数。用C、C++、FORTRAN、PL/I或其他语言编写的例程只要使用相同的ABI就可以相互调用。不同C标准编译的例程只要使用相同的ABI就可以互相调用

除了传递参数外,还有兼容性问题。某个版本的库可能具有某些需要指定长度的功能。下一个版本可能需要指定长度和宽度,或者它可能具有所需的长度和可选的宽度。为一个版本的库编写的程序可能无法使用另一个版本,因为它没有传递库需要的参数,即使它传递参数的方式符合 ABI。

如果您拥有库的源代码和您自己的程序的源代码,并且您使用相同的编译器编译它们,只需一个使用 C 2017/2018 开关,另一个使用 C 2011,它们就可以一起工作如果您正确调用库例程。

目标文件通常不可执行,因为它们与可执行文件的格式不同。有不同的对象格式,并且,如果没有实际实践,就理论上可能的情况而言,有人可以设计一种不包含依赖项的可执行对象文件格式,或者可以设计一个读取对象文件格式并加载它的程序加载器用于执行,如果它没有依赖项,则再次执行。不过,在这方面,您可以通过编译、链接和加载程序加载器来执行源文件。