(C / C++) как создать исполняемый файл, который может работать как на Windows, так и на Linux?

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

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

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

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

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

спасибо.

7 ответов


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


простой ответ заключается в том, что вы не можете.

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

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

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

или вы можете использовать более " общий" кросс-платформенный язык, такой как язык CLI (C# / IronPython / Java и т. д.), что .NET для Windows и Mono для linux / другие поддерживает.


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

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

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

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

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

одним из вариантов попробовать Было бы вино, которое является программой для Linux для запуска программ windows на Linux.


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

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

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

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

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

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


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

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

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

вероятно, вариант № 2 подойдет лучше...Его ваш звонок...

с уважением,


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

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


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

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

больше детали на http://www.winehq.org/