Next: A Simple Example, Previous: Interfacing to C++, Up: Building Mixed Ada & C++ Programs
Usually the linker of the C++ development system must be used to link mixed applications because most C++ systems will resolve elaboration issues (such as calling constructors on global class instances) transparently during the link phase. GNAT has been adapted to ease the use of a foreign linker for the last phase. Three cases can be considered:
c++
. Note that this setup is not very common because it
may involve recompiling the whole GCC tree from sources, which makes it
harder to upgrade the compilation system for one language without
destabilizing the other.
$ c++ -c file1.C $ c++ -c file2.C $ gnatmake ada_unit -largs file1.o file2.o --LINK=c++
$ gnatbind ada_unit $ gnatlink -v -v ada_unit file1.o file2.o --LINK=c++
If there is a problem due to interfering environment variables, it can be worked around by using an intermediate script. The following example shows the proper script to use when GNAT has not been installed at its default location and g++ has been installed at its default location:
$ cat ./my_script #!/bin/sh unset BINUTILS_ROOT unset GCC_ROOT c++ $* $ gnatlink -v -v ada_unit file1.o file2.o --LINK=./my_script
If the setjmp/longjmp
exception mechanism is used, only the paths
to the libgcc libraries are required:
$ cat ./my_script #!/bin/sh CC $* `gcc -print-file-name=libgcc.a` `gcc -print-file-name=libgcc_eh.a` $ gnatlink ada_unit file1.o file2.o --LINK=./my_script
Where CC is the name of the non-GNU C++ compiler.
If the zero cost
exception mechanism is used, and the platform
supports automatic registration of exception tables (e.g. Solaris or IRIX),
paths to more objects are required:
$ cat ./my_script #!/bin/sh CC `gcc -print-file-name=crtbegin.o` $* \ `gcc -print-file-name=libgcc.a` `gcc -print-file-name=libgcc_eh.a` \ `gcc -print-file-name=crtend.o` $ gnatlink ada_unit file1.o file2.o --LINK=./my_script
If the zero cost
exception mechanism is used, and the platform
doesn't support automatic registration of exception tables (e.g. HP-UX,
Tru64 or AIX), the simple approach described above will not work and
a pre-linking phase using GNAT will be necessary.