Włączenie nieużywanych symboli do plików obiektowych przez kompilator w C vs C ++
To może być głupie pytanie, ale być może ktoś może dostarczyć jakiegoś wglądu.
Mam kilka zmiennych globalnych zdefiniowanych w pliku nagłówkowym (tak tak, wiem, że jest źle, ale jest to tylko hipotetyczna sytuacja). Dołączam ten plik nagłówkowy do dwóch plików źródłowych, które są następnie kompilowane w dwa pliki obiektowe. Symbole globalne nie są przywoływane w żadnym miejscu kodu.
Jeśli pliki źródłowe to C, wygląda na to, że kompilator pomija symbole globalne i wszystko łączy się bez błędów. Jeśli pliki źródłowe to C ++, symbole są zawarte w obu plikach obiektowych, a następnie otrzymuję błędy linkera. W C ++ używam extern „C”, gdy dołączam nagłówek.
Używam kompilatora Microsoft z VS2005.
Oto mój kod:
Plik nagłówka (test.h):
#ifndef __TEST_H
#define __TEST_H
/* declaration in header file */
void *ptr;
#endif
C Pliki źródłowe:
test1.c
#include "test.h"
int main( ) {
return 0;
}
test2.c
#include "test.h"
Pliki źródłowe C ++:
test1.cpp
extern "C" {
#include "test.h"
}
int main( ) {
return 0;
}
test2.cpp
extern "C" {
#include "test.h"
}
W przypadku C pliki obiektów wyglądają mniej więcej tak:
Dump of file test1.obj
File Type: COFF OBJECT
COFF SYMBOL TABLE
000 006DC627 ABS notype Static | @comp.id
001 00000001 ABS notype Static | @feat.00
002 00000000 SECT1 notype Static | .drectve
Section length 2F, #relocs 0, #linenums 0, checksum 0
004 00000000 SECT2 notype Static | .debug$S
Section length 228, #relocs 7, #linenums 0, checksum 0
006 00000004 UNDEF notype External | _ptr
007 00000000 SECT3 notype Static | .text
Section length 7, #relocs 0, #linenums 0, checksum 96F779C9
009 00000000 SECT3 notype () External | _main
00A 00000000 SECT4 notype Static | .debug$T
Section length 1C, #relocs 0, #linenums 0, checksum 0
String Table Size = 0x0 bytes
A dla C ++ wyglądają mniej więcej tak:
Dump of file test1.obj
File Type: COFF OBJECT
COFF SYMBOL TABLE
000 006EC627 ABS notype Static | @comp.id
001 00000001 ABS notype Static | @feat.00
002 00000000 SECT1 notype Static | .drectve
Section length 2F, #relocs 0, #linenums 0, checksum 0
004 00000000 SECT2 notype Static | .debug$S
Section length 228, #relocs 7, #linenums 0, checksum 0
006 00000000 SECT3 notype Static | .bss
Section length 4, #relocs 0, #linenums 0, checksum 0
008 00000000 SECT3 notype External | _ptr
009 00000000 SECT4 notype Static | .text
Section length 7, #relocs 0, #linenums 0, checksum 96F779C9
00B 00000000 SECT4 notype () External | _main
00C 00000000 SECT5 notype Static | .debug$T
Section length 1C, #relocs 0, #linenums 0, checksum 0
String Table Size = 0x0 bytes
Zauważam, że _ptr jest wymieniony jako UNDEF, gdy kompiluję źródło C i jest ono definiowane podczas kompilacji źródła C ++, co powoduje błędy linkera.
Rozumiem, że nie jest to dobra rzecz do zrobienia w prawdziwym życiu, staram się tylko zrozumieć, dlaczego jest inaczej.
Dzięki.