2009-09-24 7 views
0

저는 임베디드 시스템 (RTXC)에서 #define 명령을 통해 활성화 된 디버거 기능을 비활성화해야합니다. 그러나 #define을 undefine으로 변경하면 컴파일이 정상적으로 작동하지 않지만 링커가 실행되면 디버거 코드에 속하지 않은 심볼에 대한 오류가 발생합니다 (디버거 변수가 처리하지 않아야 함). 정의 됨). 사전 처리기 변수가 정의되지 않았거나 정의되지 않은 상태로 유지되도록 Make가 할 수있는 방법이 있습니까?변수를 정의 해제 할 수 있습니까?

+0

이 태그를 편집하십시오. "make", "define", "undef"는 좋은 SO 태그가 아닙니다. –

+1

@Amr : define과 under에 동의하지만 make는 특정 도구를 참조하기 때문에 좋은 SO 태그입니다. – Brian

답변

1

질문에 대한 답은 아니오입니다. 코드에서 #define 표현식으로 변수를 정의 할 수 없도록 절대적으로 설정할 수 없습니다.

당신은 애매한 문제가있는 것 같습니다. 그것은 당신의 Makefile에있는 버그, 철자가 틀린 지시어, 나쁜 매크로 (당신이 동어 반복을 용서한다면) 또는 사소한 것일 수 있습니다. 나는 숲을 태우는 것이 좋습니다. 문제가 끝날 때까지 모든 것을 잘라 낸 다음 숨어 있던 곳을 봅니다. HelloWorld에 도착하여 문제가 지속되면 저희에게 알려주십시오.

0

아니요. 코드에서 버그를 수정해야합니다.

더 구체적으로는 #ifdef 외부의 디버그 쪽을 참조하는 것이 있습니다. Make는 거기서 당신을 도울 수 없습니다.

또 다른 가능성은 .o 또는 이전 빌드에서 남겨진 것입니다. 빌드 트리를 정리하려고 할 수 있습니다.

+0

불행히도 나는 그 두 가지를 모두 해왔고 연결 문제는 여전히 지속됩니다. 나는 변수의 모든 사용법을 점검하고 그것들이 모두 #ifdef 블록으로 묶여 있음을 보장했으며, 프로젝트에 의해 빌드 된 모든 마지막 a, o 및 so가 빌드 디렉토리에서 지워 졌는지 확인했다. 또는 신선한 내장). 그럼에도 불구하고 응답 해 주셔서 감사합니다. –

+2

@Alex Marshall : 컴파일러는 불만족스러운 참조가 어디서 왔는지 알려주지 않습니다 (보통 첫 번째 위치). 개체 파일이나 라이브러리에서 'nm -g'를 실행하여 찾았습니까? –

+0

@Jonathan Leffler : 저는 임베디드 OS 인 RTXC를 사용하고 있습니다. 컴파일러는 문제가 커널 라이브러리 librtxc.a 중 하나에서 발생한다고 알려줍니다. 'nm -g librtxc.a'는 참조가 rtxcasm.o에 있음을 알려줍니다. 라이브러리는 처음부터 다시 컴파일되고 CBUG 변수는 정의되지 않았지만 _isrcnt에 대한 참조는 그대로 유지됩니다. 내가 isrcnt에 대한 모든 참조를 확인했는데, 모두 #ifdef CBUG 태그로 적절히 묶여 있으므로 _isrcnt 심볼을 rtxcasm.o 오브젝트 파일로 컴파일해야하는 이유가 없습니다. 부수적으로, 'nm -g'에 감사드립니다. 나는 그것을 모르고있었습니다. –

관련 문제