Clang C++ Cross Compiler - создание исполняемого файла Windows из Mac OS X

Я создал приложение c++ с помощью Xcode на моем Mac с помощью компилятора Clang.

Я хочу скомпилировать исходные файлы для создания исполняемого файла, который может быть запущен на машине windows, однако я не могу получить Clang для создания исполняемого файла.

вот что я пробовал:

clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe

это создает исполняемый файл, однако это не работает (Windows дает мне ошибку, связанную с приложением 16 бит -не понимаю этого - это не может работать на 64 bit)

clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp 

по какой-то причине, когда я использую -target флаг я получаю сообщение о том, что компилятор не может найти <iostream> заголовок, однако в любое другое время он никогда не стонет.
Я пробовал использовать -Ipath/to/iostreamfolder/ однако это не дает никаких лучших результатов

любые предложения, было бы здорово! Спасибо!

Я также пробовал '-triple x86-pc-win32' флаг, однако я получаю это предупреждение clang: warning: argument unused during compilation: '-triple x86-pc-win32'

3 ответов


Clang в принципе может использоваться как кросс-компилятор: в отличие от большинства компиляторов clang/LLVM включает компоненты (такие как codegen, ассемблер и компоновщик) для разных платформ в одном двоичном файле.

однако вы столкнетесь с рядом проблем, пытаясь использовать его как таковой в производственной мощности:

  • вам нужны библиотеки платформ и заголовки. Чтобы создать исполняемый файл, который будет работать в Windows, вам нужны заголовки Windows и библиотеки Windows хотите связать, либо импортировать библиотеки, если вы динамически связываете, либо статические библиотеки для статической связи. Вы должны иметь возможность получить их из установки Visual Studio.

  • многие функции C++, такие как искажение имен и поддержка RTTI, не завершены в Windows. У вас будут те же проблемы с компиляцией для Windows в Windows с Clang. поддержка Windows C++ - это законченым в эти дни.

  • в Проект LLVM включает компоновщик lld, который, по-видимому, достаточно далеко, чтобы он мог самостоятельно размещать на x86 Windows и поэтому может работать для вас как кросс-платформенный компоновщик, однако lld еще не является стандартной частью дистрибутивов clang. Clang на OS X по-прежнему использует платформу OS X linker ld по умолчанию как и Clang на Windows (link.exe). Вам нужно будет получить lld и выяснить, как с ним связаться, или найти другой кросс-платформенный компоновщик.

  • водитель clang не написано как драйвер кросс-платформенного компилятора. Вероятно, вам придется сделать гораздо больше практической работы для запуска кросс-платформенной компиляции. Взгляните на выход clang -###: драйвер clang создает эту команду для вас, но вам может потребоваться выполнить большую часть той же работы, что и драйвер clang вручную. И поскольку clang получает гораздо меньше тестирования при кросс-платформенной компиляции, вы, вероятно, столкнетесь с большим количеством ошибок.

  • Xcode не поможет вам ни с чем из этого. Оно может настройте clang для сборки для OS X или iOS, но вам придется вручную настроить кросс-платформенные сборки для Windows.

Я относительно уверен, что можно собрать среду на основе LLVM для создания c "Hello, World" Windows exe на OS X или Linux, но она не совсем готова к Xcode для добавления элемента "Windows" в список возможных целевых платформ.


если вы не разработчик компилятора, вам, вероятно, лучше всего просто скопировать исходный код для машины Windows и здания с Visual Studio. Если вы являетесь или хотите быть разработчиком компилятора, то непременно помогите продвинуть способности кросс-компиляции Clang вперед. Я думаю, лязг универсальный драйвер проект захватывающий, и я бы очень хотел, чтобы прогресс продолжался.


я успешно выполнил противоположную кросс-компиляцию: компиляцию исполняемого файла Mac OS X в Windows. Это оказалось довольно легко сделать вручную на небольшом программа, то есть непосредственно компиляция .файл cpp.

во-первых, средства разработки Mac OS X поставляются с "SDKs", которые содержат все системные библиотеки и заголовки для конкретной ОС. Самой большой проблемой здесь было выяснить, как перенести SDK в Windows, сохраняя при этом все символические ссылки в SDK. (По какой-то причине создание символических ссылок на Windows требует повышенных привилегий, поэтому после создания tar.gz на OS X с символическими ссылками мне пришлось запустить 7zip в Windows в качестве администратор правильно развернет архив.)

как только SDK доступен в Windows, есть один флаг, чтобы сообщить clang, где получить все системные зависимости:-isysroot. Это в сочетании с -target флаг - это все, что мне нужно было сказать clang, как создать полные объектные файлы для OS X.

для связывания я вручную использовал lld, так как драйвер компилятора не поддерживал перекрестную связь с lld. lld поддерживает аналогичные флаги для определения целевой системы библиотеки.

последним шагом было просто копирование созданного исполняемого файла на компьютер OS X, включение разрешения execute (Windows не поддерживает те же права доступа к файлам, поэтому бит execute не устанавливается при создании) и запуск результата.


вот пошаговые инструкции по созданию Hello World .exe с помощью llvm / clang на Mac OS X.

кросс-компиляция Hello World для Windows с помощью Clang / LLVM на Mac OS X

установить llvm с homebrew. Это будет включать в себя clang и компоновщик llvm.

brew install llvm

вам понадобится доступ к библиотекам и заголовкам Visual Studio C++, которые доступны через Visual Studio 2017 на виртуальной машине Windows 10 (VM) или на компьютере Windows 10. Установить Visual Studio в окне и включить следующие "отдельные компоненты" через установщик Visual Studio:

  • Windows универсальный CRT SDK
  • Универсальная Среда Выполнения Windows C
  • пакета SDK для Windows 10 (Х. Х. Х. Х) для UWP: с++
  • VC++ 2017 vxxx набор инструментов (x86, x64)
  • Распространяемое Обновление Visual C++ 2017
  • поддержка C++/CLI

получите доступ к библиотекам MSVC и заголовкам из вашего Мак.

  • (Вариант 1) Используйте свою виртуальную машину Windows и создайте общую папку между хостом и гостем.
  • (Вариант 2) Создайте удаленный общий ресурс на компьютере с Windows и подключитесь к нему с компьютера Mac.
  • (Вариант 3) скопируйте библиотеки и заголовки на свой Mac, следуя любым условиям лицензирования.

найдите конкретные каталоги на вашей установке MSVC, которые соответствуют следующему:

// MSVC:
INCLUDES: "C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.11.25503\include"
LIBS: "C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.11.25503\lib\x86"

// C Runtime Library (CRT):
INCLUDES: "C:\Program Files (x86)\Windows Kits\Include.0.15063.0\ucrt"
LIBS: "C:\Program Files (x86)\Windows Kits\Include.0.15063.0\ucrt"

// User-Mode Library (UM):
INCLUDES: "C:\Program Files (x86)\Windows Kits\Include.0.15063.0\um"
LIBS: "C:\Program Files (x86)\Windows Kits\Lib.0.15063.0\um\x86"

создайте свой Привет Мир src:

// hello.cc

#include <cstdio>

int main(int argc, char* argv[]) {
  printf("Hello, World!\n");

  return 0;
}

компиляция и связь с компоновщиком llvm lld:

clang -fuse-ld=lld -target i386-pc-win32 -o hello.exe hello.cc \
  -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 \
  -L/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/lib/x86 \
  -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \
  -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Lib/10.0.15063.0/um/x86 \
  -Wno-expansion-to-defined \
  -Wno-msvc-not-found \
  -Wno-ignored-attributes \
  -D_CRT_SECURE_NO_WARNINGS

копия Здравствуйте.exe на компьютер Windows или виртуальную машину Windows и запустить в PowerShell:

.\hello.exe

чтобы построить 64-разрядные версии, измените цель выше и ссылку на библиотеки x64.


рассмотрите возможность использования MinGW в Mac OS X для компиляции двоичных файлов Windows. Вот инструкции о том, как это сделать в Linux:http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/

вам придется адаптировать их для Mac OS X, и вам, возможно, придется скомпилировать MinGW самостоятельно.

http://www.mingw.org