Это достигается с помощью ряда механизмов, наиболее выдающимися из которых являются системы сборки и специальные версии кода для определенных систем. Что вы делаете, так это пишете свой код так, что, если ему требуется API операционной системы, он вызывает определенную функцию. Например, я мог бы использовать MyThreadFunction()
. Теперь, когда я собираюсь под Linux, я получаю версию MyThreadFunction()
для Linux, которая вызывает pthread_create()
, тогда как версия для Windows вызывает CreateThread()
. Соответствующие включения также включены в эти конкретные файлы платформы.
Другая вещь, которую нужно сделать, это использовать библиотеки, которые обеспечивают согласованные интерфейсы на разных платформах. wxWidgets - одна из таких платформ для написания настольных приложений, как, впрочем, и Qt и GTK +. Любые библиотеки, которые вы используете, стоит попробовать найти кроссплатформенную реализацию. Кто-то, несомненно, упомянет Boost в какой-то момент здесь. Другой системой, которую я знаю, является Apache Portable Runtime (APR), которая предоставляет целый ряд функций, позволяющих запускать httpd на Windows / Linux / Mac.
Таким образом, ваша базовая кодовая база не зависит от платформы - ваша сборочная система включает в себя специфичные для системы биты, а ваша кодовая база связывает их вместе.
Теперь, вы можете сделать это с одного рабочего стола? Я знаю, что вы можете компилировать для Windows из Linux и, вероятно, для Mac OS X из Linux, но я сомневаюсь, что вы можете сделать это из Windows-Linux. В любом случае вам нужно протестировать то, что вы создали на каждой платформе, поэтому мой совет - запускать виртуальные машины (см. Vmware / virtualbox).
Наконец, редакторы / окружения: используйте все, что вам подходит. Я использую Eclipse / GVim в Linux и Visual Studio в Windows - VS - это моя "система сборки Windows".