2012-07-13 3 views
0

이 짧고 달콤한 될 파일 오류이 지금 무슨 일이 일어나고 오늘 전에 내게 일어난 적이있다 : 당신은 기능 bit_to_ascii(char const*, char*)의 두 가지 정의 중 하나가아마도 그렇게 고전하지 GCC/G ++

g++ assn1m.c segment.cpp 
/tmp/cc2yUKRO.o: In function `bit_to_ascii(char const*, char*)': 
segment.cpp:(.text+0x0): multiple definition of `bit_to_ascii(char const*, char*)' 
/tmp/cc2Xgj7t.o:assn1m.c:(.text+0x0): first defined here 
/usr/lib/gcc/i586-suse-linux/4.4/../../../crt1.o: In function `_start': 
/usr/src/packages/BUILD/glibc-2.10.1/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main' 
collect2: ld returned 1 exit status 
+0

assn1m.c 및 segment.cpp function bit_to_ascii 파일에서 정의 된 것 같습니다 ... – ForEveR

+2

여러 포함에서 보호되지 않은 헤더에있는 것으로 의심됩니다. 물론 우리가 코드를 보지 않고도 tho를 진단하는 것은 완전히 불가능합니다. – pm100

+0

@ pm100 : 두 가지 다른 TU에서 이러한 종류의 이중 포함을 방지 할 수있는 방법은 없습니다. 정확한 동작은'inline' 함수를 표시하는 것입니다. –

답변

2

이것은 assn1m.c에 있고 다른 하나는 segment.cpp에 있습니다. 이는 흔히 inline없이 헤더 파일에 정의하고 여러 소스 파일에 포함시킴으로써 발생합니다.

C99에서 inline 지정자는 C++에서와 약간 다르게 작동합니다. 제대로 작동하게하려면 extern inline으로 정의해야 할 수 있습니다.

main 함수를 프로그램의 진입 점에 대해 정의하지 않았거나 정의 된 개체 파일에 연결하지 않았지만 다중 정의 오류와 별개의 문제입니다.

+0

무엇? C++의 어떤 경우에 'extern inline'을 작성해야합니까? –

+0

C++에는 없지만 C99에는 : [이 질문] (http://stackoverflow.com/questions/216510/extern-inline)을 참조하십시오. C 및 C++에서 사용해야하는 헤더의 경우 코드가 C 또는 C++로 컴파일되는지 여부에 따라'inline' 또는'extern inline'으로 확장되는 매크로를 사용하는 것이 좋습니다. –

+0

아, C 호환 헤더라면 ... 알 겠어. –