Linking F90 with C++ can be challenging. Linking C++ with anything can be challenging. However, it is possible, though there is no generic method that works on all platforms. Many of the platforms have problems with the entry point, since traditionally the F90 entry is MAIN_, where the C++ entry is main. However, using link flags these difficulties can be overcome. On some platforms there is no problem. Template instantiation can be a problem, and the difficulties are directly proportional to how smart the C++ compiler tries to be. Most of these overzealous compilers can be told to relax via compiler flags. In general F90 is more well behaved, and this helps. On all the compilers we used, the other language's standard libraries were not found. This problem can be solved by running the opposite compiler in verbose mode (-v on many platforms). It then shows its ld line, and the libraries may be ascertained.
The sun MPI compilers are /optSUNWhpc/bin/[mpf90, mpCC, mpcc]. We have found it easiest to link on this platform using mpCC. This C++ compiler will not link F90 code immediately. However, when passed the correct libraries it becomes satisfied. They were:
-lfui -lfai -lfai2 -lfsumai -lfprodai -lfminlai -lfmaxlai -lfminvai -lfmaxvai -lfsu -lsunmath -lm -lcIt was quite important on this platform to turn off the C++ compiler's ``smart'' templates. This feature tries to gather instances of templates at link time, and prevents linking from occurring. To do this, the compiler requires the flag '-instantiate=static', which tells it to act like the original C++ compilers and just put the instances of a template used into each object file.
The IBM compilers (suprisingly) adapt to linking C++ and F90 quite easily. We used the C++ compiler and merely had to send it the F90 libraries. These were:
-L/usr/lpp/ppe.poe/lib/threads -L/usr/lpp/ppe.poe/lib -L/usr/lpp/ppe.poe/lib/ip,-L/lib/threads -lmpi_r -lvtd_r -lxlf90 -lxlopt -lxlf -lxlomp_ser -lpthreads -lm_r -lm -lc_r -lc /usr/lpp/ppe.poe/lib/libc.a
Irix C++ has the same officiousness as does the Sun compiler. Its attempt at being clever with C++ templates can be stopped easily by sending the -no_prelink -ptused flags, which tell the compiler not to pre-link, and instantiate all templates that are referenced.