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

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

Все это вытекает из моего первоначального кросс-платформенного вопроса Perl здесь .

Ответы [ 7 ]

5 голосов
/ 24 февраля 2009

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

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

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

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

5 голосов
/ 04 февраля 2010

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

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

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

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

  • Начните со скрипта crosstools, но будьте готовы потратить на это лот времени.

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

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

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

3 голосов
/ 29 мая 2009

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

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

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

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

2 голосов
/ 29 мая 2009

Почему бы вам не прочитать "Великий объединенный строитель" (http://lilypond.org/gub/ и http://valentin.villenave.info/The-LilyPond-Report-11 (раздел # 4))

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

1 голос
/ 24 февраля 2009

Компилируйте в Windows, затем используйте Wine для запуска их на любом * nix. Это работает хорошо в большинстве случаев.

0 голосов
/ 24 февраля 2009

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

0 голосов
/ 24 февраля 2009

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

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

...