MS Visual C ++ 링커 경고를 제거하는 가장 좋은 방법은 무엇입니까? "경고 LNK4221"?

StackOverflow https://stackoverflow.com/questions/1822887

문제

사용하는 CPP 소스 파일이 있습니다 #만약에 / #endif 특정 빌드에서 완전히 컴파일합니다. 그러나 이것은 다음 경고를 생성합니다.

warning LNK4221: no public symbols found; archive member will be inaccessible

실제로 사용되지 않는 더미 변수 또는 함수를 생성하기 위해 매크로를 작성하려고 생각하고 있으므로이 오류가 사라질 수 있지만 여러 파일에서 매크로를 사용하는 것과 같은 문제가 발생하지 않도록하고 싶습니다. 곱하기 정의 된 기호에 폭탄 링커.

이 경고를 제거하는 가장 좋은 방법은 무엇입니까 (링커 명령 줄의 경고를 단순히 억제하지 않고)?

FWIW, 링커 명령 줄의 경고를 억제하여 수행하는 방법에 관심이 있지만 모든 시도는 링커에 의해 단순히 무시되고 오류를 생성하는 것으로 보입니다.

또 다른 요구 사항 : 수정 사항은 개별 파일 빌드 또는 Unity 빌드 (CPP 파일 빌드를 결합)에 견딜 수 있어야합니다. 빌드 구성 중 하나가 대량 빌드 (단일 마스터가 아닌 유니티 빌드이지만 벌크 파일 그룹과 같은)이므로. Unity 파일).

도움이 되었습니까?

해결책 2

좋아, 내가 사용할 수정은 사소한 조정으로 Pavel의 제안입니다. 이 수정 사항을 사용하는 이유는 쉽게 매크로를 떨어 뜨릴 수 있으며 대량 건물 / 유니티 빌드 및 일반 빌드에서 작동하기 때문입니다.

공유 헤더 :

// The following macro "NoEmptyFile()" can be put into a file
// in order suppress the MS Visual C++ Linker warning 4221
//
// warning LNK4221: no public symbols found; archive member will be inaccessible
//
// This warning occurs on PC and XBOX when a file compiles out completely
// has no externally visible symbols which may be dependant on configuration
// #defines and options.

#define NoEmptyFile()   namespace { char NoEmptyFileDummy##__LINE__; }

완전히 컴파일 될 수있는 파일 :

NoEmptyFile()
#if DEBUG_OPTION
      // code
#endif // DEBUG_OPTION

다른 팁

익명 네임 스페이스를 사용하십시오.

namespace { char dummy; };

이러한 네임 스페이스 내의 기호에는 외부 링키지가 있으므로 내보내기 테이블에 무언가가 있습니다. 반면에, 네임 스페이스 이름 자체는 모든 번역 장치에 대해 구별되므로 충돌이 없다.

(토론은 이미 오래되었고 @adisak의 답변을 직접 언급 할 수는 없지만), 나는 이것을 작동하기 위해서는 추가 매크로 확장 마법이 필요하다고 생각합니다.

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define NONEMPTY_TRANSLATION_UNIT char TOKENPASTE2(NoEmptyFileDummy, __LINE__);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top