c++ - 为什么在 Windows 中编译的库在 Linux 操作系统中不起作用?

标签 c++ linux windows

我在 Windows 中构建了一个库。我的客户有一个Linux 上的应用程序。他想使用我的库,但我不想在 Linux 中构建它。我的无法使用它。有什么解决办法吗?

最佳答案

因为Linux和Windows有不同的ABIs (参见x86-64 ABI)和calling conventions ,一套 system calls , standard C library , standard C++ library 、C++ 标准版本(例如,符合 C++11 )、共享库格式(Linux 使用 ELF ,Windows 据说使用 PE ),甚至符号(在链接器意义上)是什么或做什么的概念(在 Linux 上,阅读 symbol visibility ;在 Windows 上,据说您需要 dllexport事)。 Levine 的书 linkers and loaders解释其中的差异。在 C++ 中,name mangling也不同。

我什至不确定 Windows 上的系统调用集是否已记录。对于 Linux,请参阅 syscalls(2)kernel source代码

最好的方法是将源代码发布为 free software 。然后,您的客户(或其他人)可以编译源代码并根据他的需要进行调整。

顺便说一句,您可能无法在 Linux 上轻松编译您的库。除非您非常仔细地构建您的库(并且了解一点 Linux 或 POSIX ),否则您肯定会遇到 portability 。问题(我不知道是哪个)。也许你的程序可能在某个地方有一些 undefined behavior它在 Linux 和 Windows 上的行为非常不同。

在一些多系统框架(如Qt)之上设计、编码和构建您自己的库或Poco应该有助于可移植性。

如果您不熟悉 Linux,您应该阅读 Advanced Linux Programming .

PS。自 20 世纪 80 年代以来,我从未在任何 Microsoft 操作系统上使用过或编码过。我从 1985 年开始使用 Unix,从 1993 年开始使用 Linux

关于c++ - 为什么在 Windows 中编译的库在 Linux 操作系统中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26134534/

相关文章:

c++ - OpenCV 矩阵加法、乘法与浮点和 8 位值的奇怪行为

linux - 无法找到 bscmake.exe - 仅在 linux 编译期间

windows - 如何将 Windows 批处理 for 循环的最终结果通过管道传输到另一个命令中

c++ - 如何让 SWIG 在 Windows 上为 intptr_t 使用 64 位整数

c++ - 标准库或Boost中有什么东西可以在运行时编译dll吗?

c++ - 如何正确地将指针传递给 C++ 中的函数,以便直接在该指针上运行的另一个函数?

c++ - 如何使用 c++ api 获取 rank 3 tensorflow::Tensor 的最大值的索引?

linux - 如何使用 JNA 在 Linux (X11 lib) 上 Hook 鼠标?

linux - 寻找ddos测试工具

windows - 在 Windows 7 上使用 Node 0.12.2 和 npm 2.7.4 ionic 安装错误