저는 매력처럼 작동하는 임베디드 시스템 용 C++ 코드를 작성했습니다. 현재 작업은 PC에서이 장치의 동작을 에뮬레이션하는 것입니다. 일부 코드는 이식해야합니다. 첫 번째 테스트에서는 mingw (g ++)를 사용하고 임베디드 시스템은 STM32이고 KEIL μVision 툴 체인을 사용합니다.익명의 네임 스페이스가 정의되지 않은 참조를 발생시킵니다 - 작동합니다
필자는 컴파일러의 특수한 이상 함보다는 기능적 동작과 관련이없는 문제에 봉착했습니다. 익명 네임 스페이스에 정의 된 클래스는 전체 프로젝트에 포함되어 있기 때문에 2 개의 클래스가 있습니다. 이제 임베디드 장치에서이 컴파일 및 문제없이 실행됩니다. g ++는 정의되지 않은 참조에 대해 불평합니다!
익명 네임 스페이스 arround를 제거하고 컴파일하고 실행하면! 하지만 왜? MAIN.CPP :
#include "notmain.h"
#include "theclass.h"
A *ourA=NULL;
int main()
{
theA = new A();
theA->dostuff(1024);
sunshine sun;
sun.Init();
}
notmain.cpp :
#include "notmain.h"
#include "theclass.h"
void sunshine::Init()
{
theA->dostuff(127);
}
notmain.h :
#ifndef NOTMAIN_H_
#define NOTMAIN_H_
class sunshine
{
public:
void Init();
};
#endif
theclass.h :
여기 상황을 재현 일부 예는 코드#ifndef THECLASS_H_
#define THECLASS_H_
#include <stdio.h>
#define theA ourA
namespace
{
class A
{
public:
void dostuff(int b)
{
a = b;
printf("Hello: %d\n",a);
}
private:
int a;
};
}
extern A *ourA;
#endif
er/Linker 출력 : 09:09:57 ** 구성의 증분 빌드 Testo 프로젝트의 디버그 ** 정보 : 빌드에 내부 빌더가 사용됩니다. g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -o main.o ".. \ main.cpp" g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -o notmain.o ".. \ notmain.cpp" g ++ -o Testo.exe notmain .o 인 main.o를 notmain.o : 오류 :에, 일을 LD 네임 스페이스 문제를 해결 제거 1 번 출구 상태
09:09:57 Build Finished (took 702ms)
을 반환하지만 왜 컴파일 않습니다, 링크 ZN8sunshine4InitEv': D:\Projekte\Testo\Debug/../notmain.cpp:6: undefined reference to
오우 라 (大 浦) ' collect2.exe 기능에서 KEIL? 아무도 나에게 이것을 설명 할 수 있습니까?
헤더 파일에 익명 네임 스페이스를 사용하지 마십시오. –
어쨌든 헤더에서 이름없는 네임 스페이스를 사용하면 어떤 이점이 있습니까? +1 잘 쓰여진 질문을위한 방법. – OMGtechy
@OMGtechy : clambake의 추론은 "익명의 네임 스페이스가 전체 프로젝트에 포함 되었기 때문에 *"; 하지만 익명의 네임 스페이스는 정반대의 결과를 낳습니다. – Clifford