【问题标题】:Does cross-platform C++ require building separately on every single platform?跨平台 C++ 是否需要在每个平台上单独构建?
【发布时间】:2021-03-13 04:55:36
【问题描述】:

我的问题实际上有两个变体,但在某些情况下,我有一个 C++ *.DLL,我使用 p/Invoke 与 Unity 一起使用。它使用 MSBuild(平台工具集:ClangCL)在 Windows 10 上构建。

现在我的问题,

  1. 特定类型的大小是否在构建 DLL之后保持不变?还是需要在目标平台(比如 Linux 或 Mac)上重新构建?

我的代码看起来有点像这样:

typedef wchar_t wchar;
static_assert(sizeof(wchar) == 2, "WideChar size-test failed.");

在 Windows 上重新编译源代码后,如果我为 Android 平台构建 Unity 项目,wchar 的大小是否也会保持不变?还是当我的字符串处理代码停止工作时,我是否会大吃一惊?

  1. 在构建 DLL 后是否保留了其他一些语言功能,或者我是否需要更改我的工作流程以解决其他问题?

特别是,让我们看看一些超级基本的东西,比如外部方法。

#define CALLING_CONVENTION __stdcall

#if _WIN32
#define DLLEXPORT(type) extern "C" __declspec(dllexport) type CALLING_CONVENTION
#else
#define DLLEXPORT(type) extern "C" type CALLING_CONVENTION
#endif

DLLEXPORT(void) DoSomething(const wchar* ManagedString);
// expands to
// extern "C" __declspec(dllexport) void __stdcall DoSomething(const wchar* ManagedString)
// on Windows

对于托管,

[DllImport("DllName", CharSet = CharSet.Unicode)]
public static extern void DoSomething([MarshalAs(UnmanagedType.LPWStr)] string input);

这是否也会保持与其他平台的互操作性?还是我需要特意在 Linux 上构建 C++ DLL,然后将 that 用于 Android 平台?

【问题讨论】:

  • “在 Linux 上构建 C++ DLL” -- 无法完成。 Linux 使用.so(共享对象)文件而不是 Windows 特定的 DLL 格式。您可能能够从 C++ 源代码在 Linux 上构建共享库,但不能构建 DLL。您的意思是“共享库”而不是“DLL”还是您提出问题的原因?
  • @JaMiT 在这种情况下,我的问题仍然是一样的。在 Android 上部署时,是否需要将项目重建为 *.so 以将其用于 Unity 项目?
  • @JaMiT -- 在 Linux 上运行的编译器无法创建 DLL 没有技术原因。您无法在 Linux 上使用 DLL,因为 Linux 以特定于 Linux 的 .so 格式传输。
  • @PeteBecker 是的,这在技术上是正确的,但这并不是 OP 真正在谈论的内容。在 Linux 上交叉编译 Windows DLL 将使用 Windows ABI,就像在 Windows 上编译它一样。 OP 认为切换到 Linux 会改变 ABI(即使 OP 不知道术语“ABI”)。我正要提到 Android 无法使用 DLL,但 WineHQ 可能不同意...

标签: c# c++ unity3d cross-platform interop


【解决方案1】:

每个平台通常有不同的ABI。例如,Windows 上的 long 是 32 位(来自内存),但 Linux 上的 long 是 64 位。在您的示例中,Windows 上的 wchar_t 是 16 位,但在 Linux 上是 32 位。 C++ 名称的错位方式也因平台而异。

Windows 和 Linux 都有不同的系统调用(malloc 等标准库函数通常最终会调用特定于平台的系统调用)。但不仅如此,每个平台存储和加载可执行代码的方式(以及它如何动态链接到其他可执行代码)也不同,并且在两者之间没有某种翻译器(例如WINE),通常是不可能的运行为不同平台编译的可执行代码。

因此,一般来说,您需要为您打算支持的每个平台编译代码。另请参阅 Unity 论坛中的 this post

【讨论】:

  • 您能否指导我在 Windows PC 上使用 MSBuild 构建 .so/.dylib 文件?
  • Here's some MS documentation 关于如何使用 Visual Studio 来定位 Linux,here's 是文档中的一个更一般的主题,它还显示您可以定位 Android 和 iOS。然而,我在这方面没有经验。请注意,根据本文档,您需要拥有 Apple 开发者帐户和运行 macOS 和 Xcode 的 Mac(由于许可要求)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2010-10-07
相关资源
最近更新 更多