How does g++ link an objective file .o built by gcc?

Jonathan Wakely jwakely.gcc@gmail.com
Thu Jan 4 18:53:05 GMT 2024


On Thu, 4 Jan 2024 at 18:48, Dingjun Chen
<Dingjun.Chen@geotechairborne.com> wrote:
>
> HI, everyone,
>
> I have a question for you.
>
> I have multiple c++ files .cc (main program is C++) and one c file 'librtd-dm6620.c'. Of course I will use g++ to build the executable. For that 'librtd-dm6620.c' file I still want to build its .o file via gcc because there are some possibly fatal warnings if I use g++ to build this .c file. If this .c file is built with gcc, there is no any warning and it is perfect in compilation.

Then that means you are trying to compile C code using the C++
compiler. That might work sometimes, for some C code, but will often
not work. C and C++ are different languages.


>
> Finally, I want to build the executable by linking all .o files via g++.  The problem is that the .o file built by gcc is not really linked by g++.  All defined functions in 'librtd-dm6620.c' cannot be found by the g++ linker 'ld'.

That's because the C++ compiler uses "name mangling" when it compiles
functions, so that the symbol names in the .o are different when
compiled as C++.

For example, a function void f() { } will be compiled to a symbol
called "f" when compiled as C, but a symbol called "_Z1fv" when
compiled as C++.

You either need to compile all your C files as C++, so that the symbol
names are all consistent, or you need to tell the C++ compiler not to
mangle the names, like so:

#ifdef __cplusplus
extern "C" {
#endif
void f() { }
#ifdef __cplusplus
}
#endif

When this is compiled by a C++ compiler it will produce a symbol
called "f", just like when compiled by a C compiler.

The simplest answer is probably just to stop trying to compile C files
as C++ code. Either write C++, or write C, don't write C and then
compile as something different.


More information about the Gcc-help mailing list