(C / C ++) Как создать исполняемый файл, который может работать как в Windows, так и в Linux? - PullRequest
8 голосов
/ 15 сентября 2011

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

В последнее время я изучаю исходный код кросс-платформенного Java GUI-приложения с открытым исходным кодом. Я удивлен, обнаружив, что серверная часть этого приложения с графическим интерфейсом представляет собой небольшой исполняемый файл, созданный из кодов C ++. Независимо от того, используют ли пользователи это приложение в Windows или Linux, графический интерфейс Java будет вызывать один и тот же исполняемый файл в папке bin.

Я просто хочу знать, как этот исполняемый файл может работать как в Windows, так и в Linux?

Мне также интересно создать кроссплатформенное приложение с графическим интерфейсом Java с использованием программы на C ++ в качестве движка. Эта программа на C ++ доступна только для Linux. Я некоторое время гуглил и обнаружил, что мне нужно использовать Cygwin для переноса его на Windows. Однако, если я использую Cygwin, у меня будет 2 разных исполняемых файла.

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

Спасибо.

Ответы [ 7 ]

9 голосов
/ 15 сентября 2011

Простой ответ: вы не можете.

Бинарные исполняемые форматы PE (Windows) и ELF (Linux) совершенно разные.

Не говоря уже о том, что для программы на C / C ++ требуется подключение к библиотекам, которые не будут доступны одновременно ни на одной платформе.

Однако вы можете использовать Wine в Linux для запуска исполняемого файла Windows, при условии, что он не пытается выполнять экзотические вызовы, специфичные для Windows.

Или вы можете использовать более «обычный» кроссплатформенный язык, такой как язык CLI (C # / IronPython / Java и т. Д.), Который поддерживает .NET для Windows и Mono для linux / others.

8 голосов
/ 15 сентября 2011

Невозможно иметь один собственный исполняемый файл, скомпилированный из исходного кода C ++, который работает на разных платформах. Я не верю вам, что в Windows и Linux запускается один и тот же исполняемый файл, как вы заявляете во втором абзаце.

3 голосов
/ 15 сентября 2011

Проще говоря, невозможно запустить один и тот же исполняемый файл на разных платформах. Это верно для Windows, Linux или любой другой платформы UNIX.

Идея наличия единственного исполняемого файла не нова и является идеей Java Runtime и Windows .Net (Mono для Linux). Сами они полагаются на разные исполняемые файлы, скомпилированные на конкретных машинах.

Независимо от того, пользователи используют это приложение в Windows или Linux, графический интерфейс Java вызовет тот же исполняемый файл в папке bin.

Они могут просто использовать соответствующие пути к этим исполняемым файлам, и эти исполняемые файлы, вероятно, скомпилированы отдельно на разных платформах. Трудно сказать, не глядя на код.

Cygwin - это интерфейс командной строки в Windows, обеспечивающий внешний вид UNIX.

Один из вариантов - Wine, которая является программой для Linux для запуска Windows-программ в Linux.

2 голосов
/ 15 сентября 2011

Это может быть возможно, если операционные системы находятся на одной и той же платформе.

Однако Linux может работать на различных платформах с разными процессорами: VAX, MAC, PC, Sun и т. Д.

Одна проблема состоит в том, что исполняемый файл содержит инструкции по сборке (машинный код), специфичные для процессора.Машинный код для добавления регистра с использованием процессора ARM может отличаться от процессора Motorola, Intel или Sun.Таким образом, в этом контексте один исполняемый файл может не гарантированно работать на разных платформах.

Другая проблема заключается в том, что библиотека времени выполнения может также выполнять вызовы определенных функций ОС (таких как открытие файла, отображение текста и т. Д.).) Некоторые операционные системы могут не предоставлять такую ​​же функциональность;в то время как другие имеют другой метод для выполнения той же функциональности.ОС на встроенной платформе может не поддерживать файловую систему.Windows Vista может блокировать вызовы из-за небезопасных запросов MSDOS.

Другие языки становятся независимыми от платформы, генерируя код, который выполняется «виртуальной машиной».Код не выполняется непосредственно процессором.

Традиционный метод переноса методов на C и C ++ заключается в предоставлении исходного кода и предоставлении клиентам возможности создавать программное обеспечение на своей платформе.Другие процессы доставки - это создание исполняемого файла для каждой поддерживаемой платформы;это становится кошмаром обслуживания.

0 голосов
/ 03 апреля 2013

Если вы создаете приложение MS Windows с хорошим поведением, оно может работать без изменений на платформах Linux x86 с помощью утилиты wine.

Wine isслой совместимости, который обеспечивает Win32 и связанные вызовы библиотеки времени выполнения, так что программа считает, что она работает в MS Windows, но уровень Wine преобразует их в Linuxism с действительно хорошей производительностью.

Подробнее на http://www.winehq.org/

0 голосов
/ 03 апреля 2013

Разве вы не можете заставить программу на C ++ загружать соответствующие библиотеки, используя #ifdef? Я думаю, что это решение C ++ для кроссплатформенных двоичных файлов. Однако код необходимо настроить для работы с обеими или всеми выбранными библиотеками.

Однако без java-интерфейса, 2 разных двоичных файлов, летучей мыши и sh или программы типа wine вы не сможете запустить соответствующий двоичный файл.

0 голосов
/ 15 сентября 2011

Вы не можете сделать это .... то есть. вы не можете запустить один и тот же исполняемый файл как в Unix, так и в Windows.

Windows использует исполняемые файлы, тогда как Unix использует формат файлов elf. Они в основном разные. В отличие от аналогичной Java, где вы можете запустить один и тот же исполняемый файл (байт-код) на обеих машинах, который, в свою очередь, использует для выполнения интерпретатор (JVM).

Теперь сказал, что у вас есть два варианта ...

  1. Либо вы можете установить компиляторы C на Windows и Linux (Unix), а затем скомпилировать свой код на них обоих.
  2. Или вы можете установить Wine, программное обеспечение для переноса на linux, которое сможет запускать исполняемый файл windows на linux путем эмуляции windows.

Вероятно, вариант № 2 был бы более подходящим ... Это ваш вызов ...

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...