gcc
and g++
are compiler-drivers of the GNU Compiler Collection (which was once upon a time just the GNU C Compiler).
Even though they automatically determine which backends (cc1
cc1plus
...) to call depending on the file-type, unless overridden with -x language
, they have some differences.
The probably most important difference in their defaults is which libraries they link against automatically.
According to GCC's online documentation link options and how g++ is invoked, g++
is equivalent to gcc -xc++ -lstdc++ -shared-libgcc
(the 1st is a compiler option, the 2nd two are linker options). This can be checked by running both with the -v
option (it displays the backend toolchain commands being run).
Compiling position-independent code when not necessary is a performance drag on some platforms (most notably, the register-starved x86 architecture, because PIC takes away a register that can be used more freely when non-PIC), but there should be no detrimental effects otherwise.
Going further, it is even possible to create a position-independent executable (-fPIE
) built out of only position-independent code.
That being said, libtool can automatically produce both PIC and non-PIC objects for each source file you compile, and it should be easy to do the same even in a build system without libtool integration.
Best Answer
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Use `-fPIC` or `-fpic` to generate position independent code. Whether to use `-fPIC` or `-fpic` to generate position independent code is target-dependent. The `-fPIC` choice always works, but may produce larger code than `-fpic` (mnemonic to remember this is that PIC is in a larger case, so it may produce larger amounts of code). Using `-fpic` option usually generates smaller and faster code, but will have platform-dependent limitations, such as the number of globally visible symbols or the size of the code. The linker will tell you whether it fits when you create the shared library. When in doubt, I choose `-fPIC`, because it always works.