**************************************** ******************************
**************************************** ******************************
Differences between GCC and G ++
**************************************** ******************************
Gcc/g ++ requires a total of four steps for compiling.
1. pre-process and generate the. I file [pre-processor CPP]
2. Convert the pre-processed file into an assembly language to generate the file. s [compiler egcs]
3. Generate. O files from assembly to target code (machine code) [assembler as]
4. Connect the target code to generate an executable program [linker ld]
When you invoke GCC, it normally does preprocessing, compilation, assembly and linking.
"Overall options" allow you to stop this process at an intermediate stage. For example,
-C option says not to run the linker. Then the output consists of object files output
The aggreger.
-E stop after the preprocessing stage; do not run the compiler proper. The output is in
The form of preprocessed source code, which is sent to the standard output.
-S stop after the stage of compilation proper; Do not assemble. The output is in the form
Of an attacker code file for each non-aggreger input file specified.
**************************************** ******************************
**************************************** ******************************
1.g ++ compiles both. C and. cpp as C ++ programs, while GCC compiles. cpp as a C ++ program.
In the compilation phase, G ++ calls GCC. For C ++ code, the two are equivalent, but because the GCC command cannot be automatically connected to the library used by the C ++ program, therefore, G ++ is usually used to complete the link. For the sake of unification, G ++ is used to compile/link all.
Example:
/*************************************** *******************************
* Compiler: GCC 4.5.1 20100924 (Red Hat 4.5.1-4)
* Last Update: Sun 27 May 2012 04:05:23 pm CST
* File name: Test. cpp
* Description:
**************************************** ********************************/
# Include <iostream>
Int main ()
{
STD: cout <"love" <STD: Endl;
Return 0;
}
[Test1 @ localhost tempcode] $ gcc-O test. cpp
/Tmp/cczbzjdu. O: In function 'main ':
Test. cpp :(. Text + 0x14): Undefined reference to 'std: cout'
Collect2: LD returned 1 exit status
[Test1 @ localhost tempcode] $ g ++-O test. cpp can be successful with G ++.
**************************************** ******************************
However, if you want to use GCC to link the C ++ standard library, you can do this.
[Test1 @ localhost tempcode] $ gcc-O test. cpp-lstdc ++
**************************************** ******************************
2. The _ cplusplus macro indicates that the compiler will explain the code in C or C ++ syntax.
For example, void Foo (int x, int y );
After the function is compiled by the C compiler, its name in the symbol table is Foo, while the C ++ compiler generates names such as _ z3fooii to support function overloading and secure type connection. C ++ programs cannot directly call C functions because the names in the symbol table are different after compilation. C ++ provides a C connection to exchange the specified symbol extern "C" to solve this problem.
**************************************** ******************************
**************************************** ******************************
**************************************** ******************************
Extern C "" in C ++ ""
/*************************************** *******************************
* Compiler: GCC 4.5.1 20100924 (Red Hat 4.5.1-4)
* Last Update: Sun 27 May 2012 03:21:50 pm CST
* File name: cexample. h
* Description:
**************************************** ********************************/
Extern int functest (int );
/*************************************** *******************************
* Compiler: GCC 4.5.1 20100924 (Red Hat 4.5.1-4)
* Last Update: Sun 27 May 2012 03:23:03 pm CST
* File name: cexample. c
* Description:
**************************************** ********************************/
# Include "cexample. H"
# Include <stdio. h>
Int functest (int x)
{
Printf ("% d \ n", X );
}
/*************************************** *******************************
* Compiler: GCC 4.5.1 20100924 (Red Hat 4.5.1-4)
* Last Update: Sun 27 May 2012 03:11:50 pm CST
* File name: 1.cpp
* Description:
**************************************** ********************************/
// # Include <stdio. h>
// # Ifdef _ cplusplus
// Extern "C"
//{
// # Endif
# Include "cexample. H"
// # Ifdef _ cplusplus
//}
// # Endif
Int main (INT argc, char * argv [])
{
Functest (1 );
Return 0;
}
The following uses the-s option of GCC to only activate preprocessing and compilation and compile the file into assembly code.
[Test1 @ localhost tempcode] $ gcc-s cexample. c
[Test1 @ localhost tempcode] $ gvim cexample.. s
. Globl functest
. Type
Functest, @ Function
Functest:
View the assembly code. You can see that the functest function in cexample. C is named functest in the symbol table.
You can also use the-C option to generate the target code and directly view the name of the target code in the symbol table.
The-C option says not to run the linker. Then the output consists of object files output by the specified er.
[Test1 @ localhost tempcode] $ gcc-C cexample. C // generate the target file
Use objdump-display information from object files.
-T print the symbol table entries of the file.
[Test1 @ localhost tempcode] $ objdump-T cexample. o
Cexample. O: File Format elf32-i386
Symbol table:
00000000 l DF * ABS * 00000000 cexample. c
00000000g f. Text 0000001c functest
00000000 * und * 00000000 printf
[Test1 @ localhost tempcode] $ g ++-O 1 1.cpp cexample. o
/Tmp/ccaodc5a. O: In function 'main ':
1. cpp :(. Text + 0x11): Undefined reference to 'functiontest (INT )'
Collect2: LD returned 1 exit status
Generate the target Code of 1. cpp separately for viewing.
[Test1 @ localhost tempcode] $ g ++-C 1.cpp
[Test1 @ localhost tempcode] $ objdump-T 1.o
1. O: File Format elf32-i386
Symbol table:
00000000 l DF * ABS * 00000000 1.cpp
00000000g f. Text 0000001c main
00000000 * und * 00000000 _ z8functesti
The name of functest in the 1. O symbol table is _ z8functesti, which is different from the name of functest in the cexample. O symbol table. Therefore, the link fails.
Below is 1. add extern "C" to CPP, so that the C ++ compiler will generate the target code for the items included in extern "C" {} according to the C compiler, in this way, the function name will not appear in. the name and. the name in the C target code is different. _ Cplusplus: the macro indicates that the compiler will explain the code in C or C ++ syntax.
/*************************************** *******************************
* Compiler: GCC 4.5.1 20100924 (Red Hat 4.5.1-4)
* Last Update: Sun 27 May 2012 03:11:50 pm CST
* File name: 1.cpp
* Description:
**************************************** ********************************/
# Include <stdio. h>
# Ifdef _ cplusplus
Extern "C"
{
# Endif
# Include "cexample. H"
# Ifdef _ cplusplus
}
# Endif
Int main (INT argc, char * argv [])
{
Functest (1 );
Return 0;
}
[Test1 @ localhost tempcode] $ g ++-C 1.cpp
[Test1 @ localhost tempcode] $ objdump-T 1.o
1. O: File Format elf32-i386
Symbol table:
00000000g f. text0000001c main
00000000 * und * 00000000 functest
After compilation, you can pass.
[Test1 @ localhost tempcode] $ g ++-O 1 1.cpp cexample. o
[Test1 @ localhost tempcode] $./1
1
**************************************** ******************************
If you directly use GCC to compile the link between 1.cpp and cexample. C, an error occurs. As mentioned above, GCC treats 1. cpp as a C ++ program and treats. C as a C program. Therefore, if the function name in the generated symbol table is different, an error occurs when linking.
[Test1 @ localhost tempcode] $ gcc-O 1 1.cpp cexample. c
/Tmp/ccswh6xc. O: In function 'main ':
1. cpp :(. Text + 0x11): Undefined reference to 'functiontest (INT )'
Collect2: LD returned 1 exit status
However, if you use g ++ to compile the link between 1.cpp and cexample. C, no error occurs, because both. C,. cpp, and g ++ are treated as C ++ programs.
[Test1 @ localhost tempcode] $ g ++-O 1 1.cpp cexample. c
**************************************** ******************************
**************************************** ******************************
Why does the C ++ program not need to add extern C to call the C standard library ""
Because the C ++ program calls the C standard library, taking this into account, in the C header file (. h header file) has been specially processed, that is, when compiling the C ++ program, the C calling mechanism (extern "C") is used for the functions declared in these C header files "), instead of using the default C ++ call mechanism, this prevents the C ++ function call mechanism from failing to find the corresponding function in the C library.
**************************************** ******************************
Reference: G ++
Based on the GCC compiler, first prepare some knowledge about C and C ++:
Differences between GCC and G ++