Разница между программой на C ++, разработанной под Windows и Linux - PullRequest
11 голосов
/ 28 февраля 2010

В чем разница между программой, разработанной на C ++ под Windows и Linux?

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

Ответы [ 9 ]

8 голосов
/ 28 февраля 2010

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

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

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

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

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

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

Это можно решить с помощью Wine .

3 голосов
/ 28 февраля 2010

В двух словах,

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

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

2 голосов
/ 17 июля 2018

Когда программа C ++ компилируется на платформе, она в конечном итоге превращается в форму, понятную машине (то есть машинный код). Под капотом программа использует системные вызовы для выполнения привилегированных действий. Эти системные вызовы реализуются через методы или API. Эти методы отличаются от платформы к платформе. Следовательно, на каждой платформе скомпилированный код отличается. Существует множество кросс-компиляторов, если вы хотите скомпилировать код для другой платформы.

2 голосов
/ 28 февраля 2010

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

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

1 голос
/ 28 февраля 2010

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

1 голос
/ 28 февраля 2010

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

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

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

1 голос
/ 28 февраля 2010

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

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

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

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

1 голос
/ 28 февраля 2010

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

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

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