LINUX.ORG.RU

Кросс-компиляция из Windows под Linux. Получение бинарных файлов под Linux


0

2

Мне поставили задачу - разобраться с кросскомпиляцией C и C++ приложений из под Windows для Linux.

Я попробовал использовать Cygwin для этих целей. Установил эту оболочку, запустил её. Установил компилятор cygwin-gcc-3.3.6-glibc-2.3.2-linux (старый правда). И попробовал из него скомпилировать обычный HelloWorld и запустить его под Linux всё получилось.

Но задача стоит чтобы из нашего Windows-приложения запускать кросс-компилятор, который будет компилировать некоторые файлы. Как вообще это можно реализовать? Просто в данном случае приходится запускать Cygwin, а уже из него gcc-linux или g++-linux. Пока не вижу путей запуска из нашего приложения Windows Cygwin и далее уже в нём запуска компилятора.

Может быть какие-то есть другие выходы из ситуации? Как-то можно настроить вообще отдельный компилятор по Windows, который будет компилить бинарники под Linux?


Ответ на: комментарий от aho

еще раз - нужной версии нет, а пакет со стороны требует новую libc и вообще ломает пол системы

Что значит нужной версии нет? Если целевая система предполагается настолько древняя, то это надо сразу при постановке задачи указывать, чтобы у разработчика сразу голова болела, как же ему сделать так, чтобы его поделие работало и с той древней версией библиотеки, и с современными версиями. Этот вопрос не так уж сложно решается. Как правило выбором другой библиотеки с аналогичными функциями, которая не меняла свое API.

delete83 ★★
()
Ответ на: комментарий от Slipeer

> Автор - провокатор.

Под какой Linux копилять?

В каждой версии каждого дистра свои версии библиотек.


Hello world наверное везде заработает, а вот что-нибудь посерьёзнее...



4.2

Иди посмотри на оперу и адоб ридер. Много ли у них вариантов блобов для всего зоопарка дистрибутивов?

Manhunt ★★★★★
()

Я бы установил Linux в виртуальную машину, причём старой версии: дело в том, что желательно программы компилировать со старой версией glibc, иначе в старых системах программа, скомпилированная в новом, скажет «GLIBC такой-то версии не найден», решается перекомпилированием из исходников на своей системе. Либо LD_LIBRARY_PATH=/path/to/libstdc++.so.6 ./application. Библиотеки-зависимости также обычно кладут вместе с программой, за исключением тех, что и так везде есть и годами и десятилетиями не меняют номера версии: библиотеки иксов, libogg, и так далее. Статическая линковка с одной стороны решение проблемы, с другой стороны - жирный бинарник, включающий в себя системные библиотеки, в которых потом найдут критичские уязвимости.

ZenitharChampion ★★★★★
()
Ответ на: комментарий от Manhunt

А также Java, OpenOffice.org, Maya, Nero, все проприетарные игры, кроме Craypn Physx Deluxe, который зависит от PulseAudio. Один пакет на весь Linux.

ZenitharChampion ★★★★★
()
Ответ на: комментарий от delete83

Положить редкоиспользуемые и часто меняющие ABI библиотеки с программой вместе.

ZenitharChampion ★★★★★
()
Ответ на: комментарий от delete83

> Что значит нужной версии нет?

то что ее нет, очевидно

Если целевая система предполагается настолько древняя


она может быть не древней, а банально LTS, ну и в той RHEL, например, не спешат обновлять библиотеки

то это надо сразу при постановке задачи указывать


многое объясняет

Как правило выбором другой библиотеки с аналогичными функциями, которая не меняла свое API.


без комментариев

aho
()
Ответ на: комментарий от aho

то что ее нет, очевидно
она может быть не древней, а банально LTS, ну и в той RHEL, например, не спешат обновлять библиотеки
многое объясняет
без комментариев

Многое объясняет (С)

delete83 ★★
()
Ответ на: комментарий от Manhunt

Иди посмотри на оперу и адоб ридер. Много ли у них вариантов блобов для всего зоопарка дистрибутивов?

Мб это потому, что opera слинкована _СТАТИЧЕСКИ_?

$ gcc helloworld.c -o helloworld

$ ./helloworld 
hello world

$ ldd ./helloworld 
	linux-gate.so.1 =>  (0xb7719000)
	libc.so.6 => /lib/libc.so.6 (0xb7589000)
	/lib/ld-linux.so.2 (0xb771a000)

$ ldd /usr/bin/opera
	не является динамическим исполняемым файлом
Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

> Мб это потому, что opera слинкована _СТАТИЧЕСКИ_?

Ну вот, пришел и всё испортил. :)

geekless ★★
()
Ответ на: комментарий от Waterlaz

блин, я говно:

$ ldd /usr/lib/opera/opera
	linux-gate.so.1 =>  (0xb7888000)
	libX11.so.6 => /usr/lib/libX11.so.6 (0xb7744000)
	libXext.so.6 => /usr/lib/libXext.so.6 (0xb7732000)
	libSM.so.6 => /usr/lib/libSM.so.6 (0xb772b000)
	libICE.so.6 => /usr/lib/libICE.so.6 (0xb7714000)
	libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb768e000)
	libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7660000)
	libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb7658000)
	libpthread.so.0 => /lib/libpthread.so.0 (0xb763d000)
	librt.so.1 => /lib/librt.so.1 (0xb7634000)
	libdl.so.2 => /lib/libdl.so.2 (0xb762f000)
	libz.so.1 => /usr/lib/libz.so.1 (0xb7619000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb752b000)
	libm.so.6 => /lib/libm.so.6 (0xb7501000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb74e4000)
	libc.so.6 => /lib/libc.so.6 (0xb737c000)
	libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb735e000)
	libuuid.so.1 => /lib/libuuid.so.1 (0xb7359000)
	libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7331000)
	/lib/ld-linux.so.2 (0xb7889000)
	libXau.so.6 => /usr/lib/libXau.so.6 (0xb732e000)
	libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb7329000)
Waterlaz ★★★★★
()
Ответ на: комментарий от Slipeer

>> и что? статическую линковку и таскание с собой звисимостей еще никто не отменял

да не отменял, но на корпоративном уровне это выглядит откровенным «костылём»


Студентота прыщавая, на «корпоративном уровне» заказчика интересует лишь наличие его платформы в списке платформ, официально поддерживаемых разработчиком программы, интересуют обязательства со стороны разработчика/интегратора. Как и что там слинковано - срать он хотел; ему нужен инструмент для работы, а не фетиш красноглазый.

Manhunt ★★★★★
()
Ответ на: комментарий от Slipeer

>Hello world наверное везде заработает, а вот что-нибудь посерьёзнее... Майнентейнеры пакетов в дистрах чем по-вашему занимаются?

Мэйнтейнеры занимаются уменьшением размера приложения, путём использования системных библиотек. Ну и чтобы выглядело однородно, да.

Однако ж проприетарщики под линукс вполне себе собирают статически, и их софт умудряется запускаться иногда даже через 5 лет после сборки.

И ничего, никто не умер. Так что если проект не открыт - статикой собрать и все дела. Как раз лишние 20 мегабайт в данном случае не важны, т.к. проприетарные продукты обычно покупают с целью «поработать», а не с целью сэкономить место на харде.

anonymous
()

1. Ставим в виртуалку/на сервер/somewhere Целевой Линукс
2. Монтируем каталог с одной системы на другу(не кринципиально откуда куда)
3. Придумываем систему оповещения о необходимости сборки исходников(например вешаем на линуксе скрипт который проверяет наличие файла compile_please.cmd в каталоге с исходниками, если есть, то запускается сборка + удаляется этот файл)
4. ююю
5. ВЫГОДА!!!!
6. Сносим цыгвин

Jetty ★★★★★
()
Ответ на: комментарий от g-71

> VirtualBox ставить - плохой вариант. У нас файлы *.c генерятся в программе.

Windows CIFS умеет, чем такой вариант плох?

backbone ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.