Как мне выполнить кросс-компиляцию кода C в Windows, чтобы двоичный файл также можно было запускать в Unix (Solaris / HPUX / Linux)?
Я изучал Cygwin / Mingw / lcc, и мне понравилось иметь возможность компилировать собственные расширения Perl C в моих окнах (желательно под cygwin), а затем запускать их на Solaris и HP unix без лишних хлопот, возможно ли это?
Это все связано с моей оригинальной PERL кросс-платформенной вопрос здесь .
Ответов (7)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 под виртуальной машиной.
Почему бы вам не прочитать "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