c++ - C 和 C++ .lib 文件是否可移植?

标签 c++ c portability

假设编译的代码实际上是可移植的(只是使用标准库的东西或其他什么),我可以在多个平台上为我的项目使用相同的 .lib 吗,或者它们只能在他们的平台上运行吗编译于?

我正在将我的 C++ 项目从 Windows 移植到 Linux,我使用了一些第 3 方库,包括 openAL、FreeType 和 FreeImage,我想知道我是否必须获取/重新编译新的库文件。

最佳答案

Windows 和 Linux 上的动态链接器以完全不同的方式工作。在 Linux 上,链接器需要 elf 格式的 .so 文件。然而,Windows 使用不同的、不兼容的格式的 .lib 和 .dll 文件。

即使您找到解决此问题的方法,两个操作系统之间的默认调用约定也不同。 C 函数调用将参数放入不同的寄存器中,因此如果编译器不使用自定义调用约定,就不可能调用这些 lib 文件中的函数,但是这会阻止任何其他代码调用您的库。

Wine Project已经创建了一个兼容层,以允许 Windows 二进制文件调用为 Linux 编译的库,但是这样的层有显着的性能和复杂性损失。

简而言之,在几乎所有情况下,您最好分别为两个操作系统重新编译项目。您提到的库 (afaik) 也都可用于 Linux,因此移植应该是一件轻而易举的事。

关于c++ - C 和 C++ .lib 文件是否可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23569439/

相关文章:

c++ - Stroustrup 的 C++ : exercise 6. 2.3 字符类型转换对我不起作用

c++ - 如何在不使用命名空间 std 和字符串库的情况下拆分和存储 const char*?

c - 为什么我在 1/2 这样的浮点表达式中得到零?

c++ - 如何在Visual Studio中设置让C++/C代码只在一个线程中运行来测试运行时间?

linux - 一个 "try"的 shell 脚本

c# - 如何在 C# 和非托管 C++ 库之间传递对指针的引用?

C - PlaySound() 在将位置作为 char[] 传递时找不到文件

c - 在 C 中使用 'const',可能会导致什么移植问题?

c - 具有声音支持的良好可移植wiimote库?

C++11 正则表达式匹配中的匹配