假设编译的代码实际上是可移植的(只使用标准库或其他东西),我可以在多个平台上为我的项目使用相同的.lib
,还是只能在他们编译的平台上运行?
我正在将我的C ++项目从Windows移植到Linux,我使用了一些第三方库,包括openAL,FreeType和FreeImage,我想知道是否必须获取/重新编译新的库文件。
答案 0 :(得分:7)
Windows和Linux上的动态链接器以完全不同的方式工作。在Linux上,链接器将使用elf格式的.so文件。然而,Windows使用.lib和.dll文件,这些文件具有不同的,不兼容的格式。
即使您要找到解决方法,两个操作系统之间的默认调用约定也是不同的。 C函数调用将参数放在不同的寄存器中,这样就不可能在没有编译器使用自定义调用约定的情况下调用这些lib文件中的函数,但这会阻止任何其他代码调用您的库。
Wine Project创建了一个兼容层,允许Windows二进制文件调用为Linux编译的库,但是对这样的层有显着的性能和复杂性损失。
简而言之,几乎在每种情况下,您最好分别为两个操作系统重新编译项目。你提到的库(afaik)都可用于Linux,所以移植应该是轻而易举的。
答案 1 :(得分:3)
像C ++这样的语言的全部目的是提供一个可移植的平台无关的源代码抽象,因为编译C ++所创建的代码不是。
您必须为目标平台重建它。
答案 2 :(得分:2)
.lib文件包含特定于平台的对象代码。每个平台都需要不同的。
您必须在您移植到的每个平台上重新编译其他库。