C ++ Переносимость между Windows и Linux - PullRequest
4 голосов
/ 16 июля 2010

У меня есть вопрос о написании программ, переносимых между Windows и Linux.

Недавно я понял, что если вы пишете программу, которая использует какую-либо внешнюю библиотеку, если у этой библиотеки нет версии для Linux (или версии для Windows при разработке в Linux), то вы облажались.

Вот тогда мой вопрос: если я напишу программу в linux, которая ссылается на lol.a, а затем захочу скомпилировать и запустить ее на windows без перекомпиляции lol.a в lol.lib, может что-то вроде MinGW или Cygwin сделать этот? Ссылка на файлы .a на платформе Windows, чтобы получить файл .exe, который может запускать Windows?

Ответы [ 4 ]

5 голосов
/ 16 июля 2010

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

В частности, CygWin не может запускать программы linux.совсем.CygWin обеспечивает только уровень совместимости posix между вашей программой и ядром Windows.

Ситуация на linux немного менее безрадостна.Wine может запускать некоторый собственный код Windows (без необходимости что-либо перекомпилировать, включая ваш оригинальный код).Но вино также имеет ограничения.Это не полный Windows API, и все, что требуется для библиотечного кода, должно быть доступно в Wine, иначе оно тоже не будет работать.Для многих простых приложений это не является серьезной проблемой, но многие более новые Windows API, некоторые темные углы старых, которые не видят особой пользы, и, в частности, все, что связано с оборудованием, вероятно, будет недоступно.

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

3 голосов
/ 16 июля 2010

Нет, Cygwin предоставляет (частично) source переносимость для * ix программ. Конечно, есть наборы инструментов более высокого уровня, которые также обеспечивают переносимость исходного кода, такие как QT и GTK. В любом случае вам все равно придется перекомпилировать программу и библиотеку. Для переносимости двоичных файлов вам понадобится, по сути, противоположность Wine, программе, которая понимает ELF и отображает системные и библиотечные вызовы Linux на Windows. Насколько я знаю, этого не существует.

1 голос
/ 16 июля 2010

Нет.Вы должны построить его отдельно для Windows или Linux.

0 голосов
/ 16 июля 2010

В вашей ситуации есть несколько предложений:

  1. Разработайте весь код для Windows, скомпилируйте и запустите его.
  2. В Linux используйте эмулятор WINE http://www.winehq.org/download/
  3. Если вы решите разработать код в Linux, посмотрите Windows SFU http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX
  4. Если возможнонапишите нам, какой вид программного обеспечения вы пытаетесь разработать - сторонние библиотеки, такие как boost [http://www.boost.org], обладают целым набором функций, которые не зависят от платформы.Вы определенно хотите проверить варианты, которые дает вам повышение.Также обратите внимание на другие сайты с открытым исходным кодом, такие как github и т. Д.
  5. Не привыкайте к использованию библиотек, специфичных для платформы.Я знаю, что они иногда облегчают жизнь, но это более чем компенсируется, когда вам нужен код на другой платформе.
...