Есть универсальный подход, пригодный в том числе и для программирования:
Прежде чем искать ответы на конкретные вопросы, закапываться в нюансах, попробуйте для самого себя сформулировать цели и задачи (в глобальном смысле), которые Вы решаете при разработке данной программы.
Из своего опыта скажу, что такой подход, когда прежде чем начинаешь кодить немного подумаешь об общем, приводит к тому, что 90% неожиданных идей, отсекается сразу, т.к. они либо никому не нужны, либо технически не реализуемы. Получаешь огромную экономию времени.
Конкретно на примере Виталия. Определите назначение Вашей программы. Например, если программа сугубо математическая, то в 99% случаев она без всякой доработки просто скомпилируется и заработает в других ОС. Но если Вы хотите написать универсальный инсталлятор или иную утилиту, пригодную для всех ОС, то это утопия. Вам придется написать 100 разных инсталяторов (утилит), которые в итоге соберете в один пакет. Но прежде чем это начинать возникнет вопрос: а зачем это вообще нужно делать? В чем цель?