Может ли программа Visual C ++ быть скомпилирована и запущена в Mac OS X или Linux? - PullRequest
3 голосов
/ 22 сентября 2011

… и если да, то как?

В частности, я хотел бы скомпилировать и запустить wavdiff в Mac OS X Snow Leopard 10.6.8.Насколько я могу судить (что не так уж далеко, так как я новичок в C ++), он был создан с помощью MS Visual C ++ или подобного.

Я был бы очень благодарен за ответы, которыеобращайтесь к общему случаю компиляции программ на Visual C ++ в Mac OS X или Linux, а также к решению конкретной проблемы выше.

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

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

Однако есть несколько предостережений, о которых следует знать:

  • поведение может отличаться на разных платформах. Стандарт C ++ оставляет много вещей, определяемых реализацией, что означает, что все зависит от конкретной платформы и компилятора, как он должен вести себя. Например, размер общих типов данных может (и будет) изменяться на разных платформах. A long обычно имеет 64-битную ширину в 64-битной Linux, но только 32-битную в 64-битной Windows. A wchar_t имеет ширину 16 бит в Windows, но обычно 32 бит в Linux. Так что, если ваш код делает предположения о поведении, определяемом реализацией, он может быть не переносимым (классическим примером является код, который предполагает, что указатель может быть сохранен в int или unsigned int. Это прекрасно работает на 32-битной машине , но в 64-битной системе вы пытаетесь сохранить 64-битные данные в 32-битном объекте.
  • , даже если ваш код переносим, ​​ваши зависимости могут отсутствовать. Самый очевидный пример, конечно, API для ОС. Код, использующий Win32 API, не будет компилироваться на платформах, где он недоступен (кроме Windows). Код, использующий API-интерфейсы POSIX, не будет компилироваться, если он недоступен (Windows поддерживает некоторые API-интерфейсы POSIX, но далеко не все).
  • C ++ может означать много разных вещей. Есть стандартизированный язык ISO, который является переносимым, а затем есть диалект, понятный отдельным компиляторам. Visual C ++, GCC и любой другой основной компилятор C ++ допускают набор языковых расширений, которые не являются частью стандарта и могут быть недоступны для другого компилятора. Если ваш код опирается на них, он может не скомпилироваться с использованием других компиляторов. (Например, Visual C ++ позволяет неконстантной ссылке связываться с временным, что строго не разрешено, и другие компиляторы отклонят его. GCC по умолчанию разрешает динамически измеренные массивы, расположенные в стеке, что, опять же, нестандартное расширение и какие другие компиляторы будут отклонять.)

Так что, на самом деле, это зависит от кода. Чистый, высококачественный код, как правило, переносим без особых проблем. За исключением, конечно, частей, которые напрямую зависят от служб ОС, которые должны быть переписаны для другой ОС (или где может быть доступна кроссплатформенная оболочка / библиотека, которая может использоваться для переноса того же самого в переносном режиме)

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

Эта программа не может быть легко перенесена (перекомпилирована без изменения исходного кода).По крайней мере, не без изменений в источнике.Он содержит зависимости от библиотек Windows и в некоторых частях связан с Windows API.

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

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

Исходя только из этого исходного файла, похоже, что сам код может быть достаточно переносимым C ++.Вопрос в том, использует ли он (или какой-либо из используемых им классов) API-интерфейсы Windows, которых нет на этих других платформах.Ставка, которую вы можете сделать, это спросить авторов, что они думают, или просто попробовать.

...