Различие между программой в C++, разработанном в соответствии с Windows и Linux

Каково различие между программой, разработанной в C++ в соответствии с Windows и Linux?

Почему не может программа, разработанная в соответствии с Windows в C++ использоваться в соответствии с Linux?

12
задан Jon Harper 17 July 2018 в 01:12
поделиться

8 ответов

  • Windows и Linux используют разные форматы контейнеров для хранения исполняемого кода ( PE против ELF ).
  • Windows и Linux имеют совершенно разные API (за исключением тривиальных программ, которые используют только CRT и STL )
  • Windows и Linux имеют совершенно другую структуру каталогов.

Вы можете написать программу, которая может использовать любой набор API (например, используя Qt ), и который может обрабатывать любую структуру каталогов, но вы все равно не сможете запустить один и тот же файл в обеих операционных системах из-за разного контейнера форматы.

Это можно решить, используя Wine .

7
ответ дан 2 December 2019 в 05:54
поделиться

Нативные программы несовместимы, потому что Windows имеет совершенно другой набор API, чем Linux, например. Как уже упоминалось, каждая платформа также использует свой исполняемый формат. Также обе платформы имеют свой собственный набор библиотек, с которыми программы будут связаны и / или будут совместно использоваться. Например, программа для Windows обычно разрабатывается в Visual Studio с использованием специфичных для Windows библиотек, таких как MFC , Win32 API и т. Д. Эти библиотеки недоступны в Linux, поэтому программа не будет даже компилироваться, если не позаботиться об использовании кроссплатформенных библиотек (таких как QT).

Однако, если вы будете осторожны, вы можете использовать кроссплатформенные библиотеки в своем коде и получить одну и ту же программу для компиляции под обеими платформами. Для такой программы вам нужно будет аккуратно поместить все специфичные для платформы детали (расположение файловой системы и т. Д.) В их собственные файлы. Затем вам нужно будет настроить правильные операторы #define и / или директивы makefile, чтобы гарантировать, что правильные файлы включены в сборку для каждой платформы.

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

Примечание Хотя исполняемые форматы различаются, некоторые программы, разработанные в Windows, могут выполняться в Linux с помощью эмулятора под названием WINE .

8
ответ дан 2 December 2019 в 05:54
поделиться

Вкратце,

Более того, даже если бы существовал инструмент для преобразования между PE и ELF, инструкции программы, необходимые для взаимодействия с операционной системой, полностью различаются между Windows и Linux. Только самый ограниченный код, предназначенный только для вычислений (который выполняет только вычисления и вообще не взаимодействует с операционной системой), может быть перенесен между системами без специальных действий. Однако это делается редко.

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

3
ответ дан 2 December 2019 в 05:54
поделиться

Каждая операционная система определяет API. Если вы запрограммируете код для вызова Win32 API , его не будет в Linux. Если вы кодируете POSIX API, в Windows это не бросится в глаза.

Чтобы узнать об этом больше, загрузите важную программу с открытым исходным кодом (например, Perl или Python ) и посмотрите, как ее сценарий 'configure' позволяет компилировать в любом месте .

2
ответ дан 2 December 2019 в 05:54
поделиться

C ++ сам по себе является переносимым. Но некоторые библиотеки C ++ - нет.Если программа на C ++ использует некоторые библиотеки, которые не переносимы, то эта программа не переносима.

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

1
ответ дан 2 December 2019 в 05:54
поделиться

Есть две основные причины.

Теоретически одна и та же программа (исходный код) для некоторых языков, таких как C, может работать как в Windows, так и в Linux. Но компиляция только отличается; это означает, что вам необходимо скомпилировать один и тот же файл исходного кода для каждой платформы.

Но на самом деле каждая операционная система имеет свой набор API. И различные методы, позволяющие выполнять работу быстрее ... Которые обычно привлекают разработчиков к их использованию. И они не придерживаются стандартов, поэтому теряют портативность.

Это было для нативных программ ... Во всяком случае, есть языки Java и Python ... Они действительно кроссплатформенные, но ради скорости нужно пожертвовать портативности.

1
ответ дан 2 December 2019 в 05:54
поделиться

Не хочу быть слишком педантичным, но разработка программы отличается от ее создания и выполнения.Во многих случаях программа, написанная в одной операционной системе, может быть построена и скомпилирована для выполнения в другой. Другие программы, как указывали другие, полагаются на определенные функции, предоставляемые только определенной ОС или библиотеками, резидентными только в этой ОС. В результате он должен быть построен и запущен на этой ОС.

1
ответ дан 2 December 2019 в 05:54
поделиться

Это большая тема.

  1. Во-первых, Windows и Linux не сопоставимы в двоичном виде. Это означает, что даже простейшие программы не будут распознаны с одной машины на другую. Именно поэтому интерпретируемые языки, такие как PHP, Perl, Python и Java, становятся столь популярными, но даже они не поддерживают одинаковый набор функций на каждой платформе.

  2. Зависимость от библиотек / поддержка ОС: Любая значительно сложная программа должна каким-то образом обращаться к системе, и многие функции, доступные на одной системе, недоступны на другой. Примеров можно привести миллион; просто поищите на so для Linux эквивалент blank или Windows эквивалент blank. Выходя за рамки поддержки ОС, приложения строятся в основном поверх библиотек функций, и некоторые из них просто недоступны в обеих системах.

1
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: