In my experience, there are three main reasons why it's cost-prohibitive to take a large existing program on one platform and port it to another: (1) it has (not necessarily purposely) extensively used some library or API (often GUI, but there are also plenty of other things) that turns out not to exist on the other platform; (2) it has unknowingly become riddled with dependency on nonstandard features or oddities of the compiler or other tools; (3) it was written by somebody who didn't know that you HAD to use some oddball feature to get things to work on the other platform (like a Linux library that isn't sprinkled with the right __declspec directives you need for a good Windows DLL).
It's much easier to write a cross-platform app if you consider that a design goal from the start, and I have three specific recommendations:
(a) Use Boost -- oodles of handy things you might ordinarily get from platform-specific APIs and libraries, but by using Boost you get it cross-platform.
(b) Do all your GUI programming using a cross-platform library. My favorite these days is Qt, but there are other worthy ones as well.
(c) Build and test EVERY DAY on both platforms, never provide an opportunity for the code to develop a dependency on only one platform and discover it only too late.