铿锵的C++;交叉编译器-从Mac OS X生成Windows可执行文件 我使用CLAN编译器在Mac上使用XCu码创建了C++应用程序。p>

铿锵的C++;交叉编译器-从Mac OS X生成Windows可执行文件 我使用CLAN编译器在Mac上使用XCu码创建了C++应用程序。p>,c++,windows,macos,clang,llvm-clang,C++,Windows,Macos,Clang,Llvm Clang,我想编译我的源文件来创建一个可在windows机器上运行的可执行文件,但是我不能让Clang生成一个可执行文件 以下是我尝试过的: clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe 这会创建一个可执行文件,但它不会运行(Windows给我一个错误,因为应用程序是16位的-不理解这一点-不能在64位上运行) 出于某种原因,每当我使用-target标志时,我都会收到一个

我想编译我的源文件来创建一个可在windows机器上运行的可执行文件,但是我不能让Clang生成一个可执行文件

以下是我尝试过的:

clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe
这会创建一个可执行文件,但它不会运行(Windows给我一个错误,因为应用程序是16位的-不理解这一点-不能在64位上运行)

出于某种原因,每当我使用
-target
标志时,我都会收到一个错误,说明编译器找不到
头,但在其他任何时候它都不会抱怨。
我尝试过使用
-Ipath/to/iostreamfolder/
,但是这并没有产生更好的结果

任何建议都很好!谢谢


我也尝试过
'-triple x86-pc-win32'
标志,但是我得到了这个警告
clang:warning:argument在编译过程中未使用:'-triple x86-pc-win32'
clang原则上可以用作交叉编译器:与大多数编译器不同,clang/LLVM包含组件(如codegen、汇编器和链接器)对于同一二进制文件中的不同平台

但是,在生产能力中使用它时,您会遇到许多问题:

  • 您需要平台库和标题。若要生成可在Windows上运行的可执行文件,您需要要链接到的Windows标题和Windows库,如果要动态链接,请导入LIB,如果要静态链接,请导入静态LIB。您应该能够从VisualStudio的安装中获得这些

  • < > > Windows上许多不完整的C++特性,例如名称篡改和RTI支持。在带有叮当声的Windows上为Windows编译时也会遇到同样的问题。Windows C++支持这些天。

  • LLVM项目包括lld链接器,它显然足够长,可以在x86 Windows上自行托管,因此可以作为跨平台链接器工作,但是lld还不是clang发行版的标准部分。默认情况下,OS X上的Clang仍然使用OS X平台链接器
    ld
    ,Windows上的Clang也是如此(
    link.exe
    )。您需要获得lld并了解如何与之链接,或者找到其他跨平台链接器

  • clang驱动程序不是作为跨平台编译器驱动程序编写的。要运行跨平台编译,您可能需要做更多的实际工作。看看
    clang-#####
    的输出:clang驱动程序为您构造该命令,但您可能需要手动完成与clang驱动程序相同的大部分工作。而且由于clang在跨平台编译时得到的测试要少得多,所以您可能会遇到更多的bug

  • Xcode不会在这方面帮助您。它可以将clang配置为针对OSX或iOS构建,但您必须手动将跨平台构建配置为Windows

我比较有信心,可以拼凑出一个基于LLVM的环境,在OS X或Linux上构建一个C“Hello,World”Windows exe,但Xcode还没有准备好将“Windows”项添加到可能的目标平台列表中


如果你不是一个编译器开发人员,你最好把源代码复制到Windows机器上,然后用VisualStudio构建。如果您是或想成为一名编译器开发人员,那么一定要帮助提升Clang的交叉编译能力。我认为Clang项目令人兴奋,我真的希望看到进展继续下去


我成功地完成了相反的交叉编译:在Windows上编译Mac OS X可执行文件。事实证明,在一个小程序上手动执行此操作非常容易,即直接编译.cpp文件

首先,Mac OS X开发工具附带“SDK”,其中包含特定操作系统的所有系统库和头文件。这里最大的挑战是如何将SDK传输到Windows,同时保留SDK中的所有符号链接。(由于某些原因,在Windows上创建符号链接需要提升权限,因此在OS X上生成带有符号链接的tar.gz后,我必须以管理员身份在Windows上运行7zip才能正确扩展存档。)

一旦SDK在Windows上可用,就会有一个标志告诉clang从哪里获取所有系统依赖项:
-isysroot
。这与
-target
标志相结合,就是我需要告诉clang如何为OSX生成完整的对象文件的全部内容

对于链接,我手动使用lld,因为编译器驱动程序似乎不支持使用lld的交叉链接。lld支持确定目标系统库的类似标志


最后一步是将生成的可执行文件复制到OS X机器上,启用执行权限(Windows不支持相同的文件权限,因此在构建时不会设置执行位)并运行结果。

考虑在Mac OS X上使用MinGW编译Windows二进制文件。以下是有关如何在Linux上执行此操作的说明:

您必须将它们适应Mac OS X,并且您可能必须自己编译MinGW


以下是在Mac OS X上使用llvm/clang构建Hello World.exe的分步说明

在Mac OS X上使用Clang/LLVM交叉编译Hello World for Windows 使用自制软件安装llvm。这将包括clang和llvm链接器

brew install llvm
<>你需要访问VisualStudioC++库和头文件,这些文件可以通过Visual Studio 2017在Windows 10虚拟机(VM)或Windows 10计算机上使用。在Windows上安装Visual Studio,并通过Visual Studio安装程序包括以下“单个组件”:

  • Windows通用CRT SDK
  • Windows通用C运行时
  • 用于UWP的Windows 10 SDK(X.X.X.X):C++
  • VC++2017 vXXX工具集(x86、x64)
  • brew install llvm
    
    // LLVM:
    INCLUDES: /usr/local/Cellar/llvm/5.0.0/include
    
    // MSVC:
    INCLUDES: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include"
    LIBS: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\lib\x86"
    
    // C Runtime Library (CRT):
    INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"
    LIBS: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"
    
    // User-Mode Library (UM):
    INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um"
    LIBS: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x86"
    
    // 'Shared' includes:
    INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared"
    
    // WinRT includes:
    INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\winrt"
    
    // Figure out your MSC 'version', e.g.
    Visual C++ 2012 (11.0)   -->     MSC_VER=1700
    Visual C++ 2013 (12.0)   -->     MSC_VER=1800
    Visual C++ 2015 (14.0)   -->     MSC_VER=1900
    Visual C++ 2017 (15.0)   -->     MSC_VER=1910
    
    // hello.cc
    
    #include <cstdio>
    
    int main(int argc, char* argv[]) {
      printf("Hello, World!\n");
    
      return 0;
    }
    
    clang -target i686-pc-win32 \
      -fms-compatibility-version=19 \
      -fms-extensions \
      -fdelayed-template-parsing \ 
      -fexceptions \
      -mthread-model posix \
      -fno-threadsafe-statics \
      -Wno-msvc-not-found \
      -DWIN32 \
      -D_WIN32 \
      -D_MT \
      -D_DLL \
      -Xclang -disable-llvm-verifier \
      -Xclang '--dependent-lib=msvcrt' \
      -Xclang '--dependent-lib=ucrt' \
      -Xclang '--dependent-lib=oldnames' \
      -Xclang '--dependent-lib=vcruntime' \
      -D_CRT_SECURE_NO_WARNINGS \
      -D_CRT_NONSTDC_NO_DEPRECATE \
      -U__GNUC__ \
      -U__gnu_linux__ \
      -U__GNUC_MINOR__ \
      -U__GNUC_PATCHLEVEL__ \
      -U__GNUC_STDC_INLINE__  \
      -I/usr/local/Cellar/llvm/5.0.0/include \
      -I/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include \
      -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \
      -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/shared \
      -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/winrt \
      -c hello.cc -o hello.o
    
    clang -fuse-ld=lld -target i686-pc-win32 -Wl,-machine:x86 -fmsc-version=1900 \
      -o hello.exe hello.o \
      -L/external/code8-cc/cc/msvctoolchain/x86/lib/msvc \
      -L/external/code8-cc/cc/msvctoolchain/x86/lib/um \
      -L/code8-cc/cc/msvctoolchain/x86/lib/ucrt
      -nostdlib -lmsvcrt -Wno-msvc-not-found 
    
    .\hello.exe