2010-11-21 9 views
1

(von Accelerated C++ Taken)Code wird wegen verschachtelter anonymer Blöcke nicht kompiliert?

Warum wird der folgende Code funktioniert nicht:

#include <iostream> 
#include <string> 

int main() { 
    { 
     const std::string s = "a string"; 
     std::cout << s << std::endl; 

     { 
      const std::string s = "another string"; 
      std::cout << s << std::endl; 
     } 
    } 
} 

Bin ich zu nisten anonyme Blöcke in C++ nicht erlaubt? Beim Versuch, die Quelle zu kompilieren, gibt gcc mir folgende Fehler (die ich keinen Sinn machen kann):

hello: In function `_start': 
(.text+0x0): multiple definition of 
`_start' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): 
first defined here 
hello:(.rodata+0x0): multiple 
definition of `_fp_hw' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata+0x0): 
first defined here hello: In function 
`_fini': (.fini+0x0): multiple 
definition of `_fini' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): 
first defined here 
hello:(.rodata+0x4): multiple 
definition of `_IO_stdin_used' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): 
first defined here hello: In function 
`__data_start': (.data+0x0): multiple 
definition of `__data_start' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): 
first defined here hello: In function 
`__data_start': (.data+0x4): multiple 
definition of `__dso_handle' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): 
first defined here hello: In function 
`_init': (.init+0x0): multiple 
definition of `_init' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.init+0x0): 
first defined here /tmp/cchh83A6.o: In 
function `main': 
hello.cpp:(.text+0x0): multiple 
definition of `main' 
hello:(.text+0xb4): first defined here 
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o:(.dtors+0x0): 
multiple definition of `__DTOR_END__' 
hello:(.dtors+0x4): first defined here 
/usr/bin/ld: warning: Cannot create 
.eh_frame_hdr section, --eh-frame-hdr 
ignored. /usr/bin/ld: error in 
hello(.eh_frame); no .eh_frame_hdr 
table will be created. collect2: ld 
returned 1 exit status
+0

Mit welchen Befehlen kompilieren und verknüpfen Sie diese? Auch wenn Sie den "anonymen Block" entfernen, haben Sie immer noch den Fehler? –

+1

Der Fehler scheint in Ihrer Build-Umgebung zu liegen, nicht in Ihrem Code. Bitte poste ein paar Infos über deine IDE und dein Setup (ein Makefile?) Und den generierten Baubefehl (du kannst es in einer Konsole sehen, kurz bevor du die Ausgabe gepostet hast). – Kos

+0

Wie würde ein benannter (nicht anonymer) Block aussehen? :) – fredoverflow

Antwort

3

Sie scheinen mit 2 oder mehr Objektdateien (oder .a-Dateien) zu verknüpfen, die die gleichen Dinge definieren. Wenn Sie gegen das eine oder andere Link verlinken, wird Ihr Linker-Problem verschwinden.

+0

D'oh. Du hast Recht, das war das Problem. Anstatt 'g ++ -o hallo hallo.cpp' schrieb es' g ++ hallo hallo.cpp'. – helpermethod

Verwandte Themen