Clang С++ Cross Compiler - создание исполняемых файлов из Mac OS X

Я создал приложение С++, используя Xcode на своем Mac, используя компилятор Clang.

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

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

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

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

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'

Ответы

Ответ 1

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

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

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

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

  • Проект LLVM включает в себя lld-компоновщик, который, по-видимому, достаточно далеко, так как он может самостоятельно размещаться на Windows x86 и поэтому может работать для вас как кросс-платформенный компоновщик, однако он еще не является стандартной частью clang. Clang OS X по-прежнему использует компоновщик платформы OS X ld по умолчанию, как и Clang on 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 поставляются с "SDK", которые содержат все системные библиотеки и заголовки для конкретной ОС. Самая большая проблема здесь заключалась в выяснении того, как переносить SDK в Windows, сохраняя при этом все символические ссылки в SDK. (По какой-то причине создание символических ссылок в Windows требует повышенных привилегий, поэтому после создания tar.gz в OS X с символическими ссылками мне пришлось запустить 7zip в Windows в качестве администратора для правильного расширения архива.)

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

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

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

Ответ 2

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

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

Установите llvm с homebrew. Это будет включать clang и llvm linker.

brew install llvm

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

  • Windows Universal CRT SDK
  • Windows Universal C Runtime
  • Windows 10 SDK (X.X.X.X) для UWP: С++
  • Набор инструментов VX ++ 2017 vXXX (x86, x64)
  • Распространяемое обновление Visual С++ 2017
  • Поддержка С++/CLI

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

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

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

// 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"

Создайте свой Hello World src:

// hello.cc

#include <cstdio>

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

  return 0;
}

Скомпилировать и связать с llvm lld linker:

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

Скопируйте файл hello.exe на компьютер под управлением Windows или Windows VM и запустите в PowerShell:

.\hello.exe

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

Ответ 3

Рассмотрите возможность использования 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