C# 是否跨平台C++;需要在每个平台上单独建造吗? 我的问题实际上有两个变体,但是在某些上下文中,我有一个使用P/Unjk的Unity使用的C++ *DLL。它是在Windows 10上使用MSBuild(平台工具集:ClangCL)构建的

C# 是否跨平台C++;需要在每个平台上单独建造吗? 我的问题实际上有两个变体,但是在某些上下文中,我有一个使用P/Unjk的Unity使用的C++ *DLL。它是在Windows 10上使用MSBuild(平台工具集:ClangCL)构建的,c#,c++,unity3d,cross-platform,interop,C#,C++,Unity3d,Cross Platform,Interop,现在我要问的问题是 在构建DLL后,特定类型的大小是否保持不变?还是需要在目标平台(比如Linux或Mac)上重新构建 我的代码看起来有点像这样: typedef wchar_t wchar; static_assert(sizeof(wchar) == 2, "WideChar size-test failed."); 在我在Windows上重新编译源代码之后,如果我为Android平台构建Unity项目,wchar的大小是否也会保持不变?或者,当我的字符串处理代码停止工

现在我要问的问题是

  • 在构建DLL后,特定类型的大小是否保持不变?还是需要在目标平台(比如Linux或Mac)上重新构建
  • 我的代码看起来有点像这样:

    typedef wchar_t wchar;
    static_assert(sizeof(wchar) == 2, "WideChar size-test failed.");
    
    在我在Windows上重新编译源代码之后,如果我为Android平台构建Unity项目,wchar的大小是否也会保持不变?或者,当我的字符串处理代码停止工作时,我会感到非常意外吗

  • 在构建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,然后使用它来构建Android平台?

    < P>每个平台通常都有不同的。例如,Windows上的
    long
    是32位(来自内存),而Linux上的
    long
    是64位。在您的示例中,Windows上的
    wchar\u t
    是16位的,而Linux上是32位的。C++名字被破坏的方式也是平台特定的。 Windows和Linux都有不同的系统调用(标准库函数如
    malloc
    通常会调用特定于平台的系统调用)。但不仅如此,每个平台存储和加载可执行代码的方式(以及它如何动态链接到其他可执行代码)也是不同的,如果中间没有某种转换器(例如),通常不可能运行为不同平台编译的可执行代码


    因此,一般来说,您需要为您打算支持的每个平台编译代码。在统一论坛中也可以看到。

    “在Linux上构建C++ DLL”——不能完成。Linux使用
    .so
    (共享对象)文件,而不是Windows特定的DLL格式。您可能可以在C++源代码上构建Linux上的共享库,而不是DLL。你的意思是“共享库”而不是“DLL”,还是这就是你提出问题的原因?@JaMiT在这种情况下,我的问题仍然是一样的。我是否需要将该项目重新构建为*.so,以便在Android上部署时将其用于Unity项目?@JaMiT——没有技术原因说明Linux上运行的编译器无法创建DLL。你不能在Linux上使用DLL,因为Linux是以特定于Linux的.so格式传输的。@PeteBecker是的,从技术上讲这是正确的,但这并不是OP所说的。在Linux上交叉编译Windows DLL将使用Windows ABI,就像在Windows上编译一样。OP认为切换到Linux会改变ABI(即使OP不知道术语“ABI”)。我想说的是,Android无法使用DLL,但可能不同意……您能否指导我如何在Windows PC上使用MSBuild构建.so/.dylib文件?关于如何使用VisualStudio以Linux为目标,以及文档中的一个更一般的主题,该主题还显示了您可以以Android和iOS为目标。然而,我在这方面没有经验。请注意,根据本文档,您需要有一个Apple开发者帐户和一个运行macOS和Xcode的Mac(因为许可要求)