Как мне выполнить кросс-компиляцию кода C в Windows, чтобы двоичный файл также можно было запускать в Unix (Solaris / HPUX / Linux)?

Я изучал Cygwin / Mingw / lcc, и мне понравилось иметь возможность компилировать собственные расширения Perl C в моих окнах (желательно под cygwin), а затем запускать их на Solaris и HP unix без лишних хлопот, возможно ли это?

Это все связано с моей оригинальной PERL кросс-платформенной вопрос здесь .

Ответов (7)

Решение

Кросс-компилятор очень сложно настроить и заставить работать правильно.

Учтите, что (сотрудникам) NetBSD приходится проделать огромный объем работы, чтобы кросс-компиляция заработала, и они используют одну и ту же ОС, только разные архитектуры.

Вам нужно, по крайней мере, скопировать все заголовки из других ОС в Windows и получить кросс-компилятор, компоновщик и т. Д. Для целевой ОС / архитектуры.

Кроме того, это может быть невозможно - perl и общие библиотеки могут быть скомпилированы с помощью собственного компилятора / компилятора, отличного от gcc, который вообще не будет доступен в Windows.

Нет, на двоичном уровне это невозможно. Существует так много различий на двоичном уровне между различными операционными системами и процессорами.

Но что вы можете сделать, так это сделать ваш исходный код расширений C совместимым, чтобы он мог компилироваться для разных платформ. C был разработан как «переносимый язык ассемблера». Если вы придерживаетесь кроссплатформенных подпрограмм, они обычно будут работать одинаково. Вам все равно нужно будет протестировать, потому что на конкретной платформе могут быть ошибки.

Я согласен с Дугласом в том , что создать кросс-компилятор и работать с ним очень сложно. Как правило, это ваш крайний выбор. Если вы выполняете загрузочную обвязку или создаете двоичный файл для встроенного устройства, то зачастую кросс-компиляция - ваш единственный вариант. Вам должно быть комфортно компилировать свой собственный gcc под Cygwin, прежде чем рассматривать кросс-компиляцию. Для кросс-компиляции вам необходимо создать gcc для работы под Windows, но который будет создавать двоичные файлы для вашей платформы выполнения. Примерные инструкции для этого можно найти здесь .

Возможно, вы хотите кросс-компиляцию, потому что у вас нет root и / или вы не можете скомпилировать на своей целевой платформе. Например, у меня был хостинг-провайдер, на котором работал Redhat Linux. Я мог запускать сценарии Perl CGI и связанные с ними модули, но я не мог скомпилировать на целевой машине, а созданные мной библиотеки должны были существовать в моем собственном каталоге.

Чтобы решить эту проблему, я мог бы попытаться выполнить кросс-компиляцию для моей целевой платформы, но вместо этого я решил настроить аналогичный хост внутри виртуальной машины в Windows. Из Cygwin вы можете создать скрипт, который будет использовать ssh в вашей виртуальной машине, копирует ваш исходный код и выполняет полную настройку / сборку. Последним шагом было развертывание бинарного артефакта в моей размещенной системе.

Я успешно запустил и Solaris 10, и Open Solaris на виртуальной машине под Windows. К сожалению, вам может быть сложнее запустить HPUX под виртуальной машиной.

Это невозможно ... но так ли уж сложно перекомпилировать код под Solaris или HP?

Скомпилируйте в Windows, затем используйте Wine, чтобы запустить их на любом * nix. В большинстве случаев это работает хорошо.

Почему бы вам не прочитать "Grand Unified Builder" ( http://lilypond.org/gub/ и http://valentin.villenave.info/The-LilyPond-Report-11 (раздел № 4))

Я не знаю, как это работает, но GUB позволяет разработчикам Lilypond компилировать примерно для 11 платформ на Linux.

(Это очень старый вопрос, но в нем отсутствует некоторая полезная информация - я лично сделал это для Solaris (SPARC и x86), AIX, HP-UX и Linux (x86, x64).)

  • Получение кросс-компиляции C++ намного сложнее, чем прямая C.

  • 32-разрядный HP-UX PA-RISC не поддерживается, потому что он использует формат SOM вместо ELF, а binutils не поддерживает (и, вероятно, никогда не будет) поддерживает SOM. Другими словами, вы можете кросс-компилировать только 64-битный PA-RISC. (Требуется чип PA-RISC 2.0.)

  • Я бы пошел с mingw вместо cygwin, если можно. Cygwin вводит множество проблем с разрешениями файлов и зависимостей cygwin1.dll, которые могут быть неприятными. Однако, если возможно, используйте linux. Все будет гораздо быстрее , потому что все инструменты и скрипты вы бежите предназначены для среды , где execи statбыстрые операции. Windows + NTFS - это не та среда.

  • Начните со сценария crossstools, но будьте готовы потратить на это много времени.

  • Сначала попробуйте установить самую последнюю версию gcc / binutuils, но если вы не можете решить проблемы, попробуйте вернуться к более старым пакетам. Например, для Power3 (AIX) кросс-компилятор серии gcc 4.x генерирует плохой код, 3.x в порядке.

  • При копировании собственных библиотек и заголовков убедитесь, что вы копируете с самой старой машины, на которой вы, вероятно, будете работать. Копирование новой библиотеки libc означает, что ваш код не будет работать ни на одной машине со старой libc.

  • При копировании собственных библиотек и заголовков вы, вероятно, захотите, чтобы tar -h превращал символические ссылки в реальные файлы, также обратите внимание, что в Solaris некоторые необходимые объектные файлы crt находятся в каталоге cc, а не в / usr / lib