Базовый двоичный формат отличается на каждой платформе, поэтому, если вы не используете виртуальную машину (как Java или Flash), вам придется перекомпилировать вашу программу на каждой платформе.
Некоторые компиляторы (например,GCC) разрешить кросс-компиляцию, но это не тривиально для настройки.Вероятно, самой простой системой для кросс-компиляции является Linux (есть несколько проектов с открытым исходным кодом, для которых кросс-компиляция настроена с Linux на Windows).
В случае приложения с графическим интерфейсом это зависит от языка -если вы застряли в C ++, Qt или wxWindows могут быть разумным выбором, предоставляя уровень абстракции над собственной оконной системой.
Если вы можете работать с Java, это упрощает жизнь, однако система управления окнами - это Java, а не нативная.
Еще один язык, о котором стоит подумать - это FreePascal с Lazarus - у него довольнохороший графический дизайнер, который компилируется в собственную оконную систему на любой платформе (WinAPI в Windows, Cocoa в OSX и GTK в Linux).