[visual-studio] Visual C ++ : 특정 링커 경고를 비활성화하는 방법은 무엇입니까?

내 코드 컴파일의 연결 단계에서이 형식의 많은 연결 경고를 생성하는 CGAL의 라이브러리를 사용하고 있습니다.

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Visual C ++ / Studio 2008에서이 특정 링커 경고를 어떻게 해제합니까?

사용중인 외부 (CGAL) 라이브러리에 대한 제어 권한이 없습니다. 외부 라이브러리를 다시 컴파일 할 수 없습니다. 따라서 내 끝에서 메시지를 수정할 필요가 있습니다.



답변

추가 링커 옵션으로 다음을 추가하십시오.

 /ignore:4099

속성-> 링커-> 명령 줄에 있습니다.


답변

2018-10-16 업데이트

보고 된 바에 따르면 VS 2013에서이 경고는 비활성화 될 수 있습니다. @Mark Ransom의 의견을 참조하십시오.

원래 답변

특정 경고를 비활성화 할 수 없습니다.

Geoff Chappell 에 따르면 4099 경고는 / wx와 함께 사용하더라도 무시하기에 너무 중요한 것처럼 처리됩니다 (경고를 오류로 처리하고 다른 상황에서는 지정된 경고를 무시 함).

링크의 관련 텍스트는 다음과 같습니다.

무시할 수없는 경고

일부 경고 번호의 경우 / ignore 옵션의 사양이 허용되지만 반드시 적용되는 것은 아닙니다. / wx 옵션이 활성 상태가 아닌 동안 경고가 발생하면 경고 메시지가 계속 표시되지만 / wx 옵션이 활성 상태이면 경고가 무시됩니다. 경고는 무시하려는 시도를 무시할만큼 중요하다고 생각되지만 사용자가 무시되지 않은 경고에 너무 높은 가격을 책정 한 경우에는 그렇지 않습니다.

다음 경고 번호가 영향을받습니다.

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

답변

(기록을 위해 그리고 msdn 포럼에서 스레드가 사라지기 전에) 비활성화 할 수없는 경고 목록에 있기 때문에 경고를 비활성화 할 수 없습니다 (적어도 VS2010에서) 경고를 비활성화 할 수 없습니다 (따라서 / wd4099가 작동하지 않음). 하지만 대신 할 수있는 것은 패치 link.exe (일반적으로 C : \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe)로 해당 목록에서 제거하는 것입니다. 착암기처럼 들리 네요. 그래도 작동합니다.

예를 들어, 4099에 대한 경고를 제거하려면 16 진수 편집기로 link.exe를 열고 03 10 (4099의 리틀 엔디안)을 읽는 15A0 행으로 이동하여 FF 00 (존재하지 않음)으로 바꿉니다.


답변

다른 사람들의 이익을 위해 내가 한 일을 포함 시켰지만.

Visual Studio (제 경우 2010)가 LNK4204 경고를 무시하도록 할 수 없기 때문에 제 접근 방식은 원하는대로 pdb 파일을 제공하는 것이 었습니다. 제 경우에는 오픈 소스 라이브러리를 사용하고 있었기 때문에 이미 pdb 파일을 빌드하는 코드가 있습니다.

그러나 기본값은 모든 PDF 파일의 이름을 같은 이름으로 지정하는 것입니다. 제 경우에는 vc100.pdb입니다. 각각의 모든 .lib에 대해 .pdb가 필요하기 때문에 이는 특히 약 20 개의 정적 .lib 파일을 생성하는 ImageMagik과 같은 것을 사용하는 경우 문제가됩니다. 하나의 디렉토리 (응용 프로그램의 링커가 라이브러리에서 링크하기 위해 참조하는 파일)에 20 개의 lib 파일이있을 수 없으며 20 개의 모든 .pdb 파일이 같은 것을 호출 할 수 없습니다.

내 솔루션은 정적 라이브러리 파일을 다시 빌드하고 PROJECT와 관련하여 .pdb 파일의 이름을 지정하도록 VS2010을 구성하는 것입니다. 이런 식으로 각 .lib는 비슷한 이름의 .pdb를 가져 오며 모든 LIB와 PDB를 프로젝트에서 사용할 수 있도록 하나의 디렉토리에 넣을 수 있습니다.

그래서 “디버그”구성을 위해 다음과 같이 편집했습니다.

속성-> 구성 속성-> C / C ++-> 출력 파일-> 프로그램 데이터베이스 파일 이름 에서

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

다음 값이어야합니다.

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (프로젝트 이름) .pdb

이제 중간 디렉토리가 아닌 .pdb 파일이 출력 디렉토리에 기록됩니다. 여기서 .lib 파일도 기록되며 가장 중요한 것은 D + 프로젝트 이름 접미사로 이름이 지정된다는 것입니다 . 이것은 각 도서관 프로젝트를 의미합니다 는 프로젝트 .lib 및 프로젝트 특정 .pdb를 생성합니다.

이제 모든 릴리스 .lib 파일, 디버그 .lib 파일 및 디버그 .pdb 파일을 개발 시스템의 한 위치에 복사 할 수 있으며 디버그 모드에서 타사 라이브러리를 사용하는 프로젝트에는 pdb가 있습니다. 디버그 모드에서 필요한 파일.


답변

/ ignore가 VC6 link.exe 옵션이라고 생각합니다. VS2005 및 VS2008의 링커의 경우 문서화 된 / ignore 옵션을 사용할 수 없지만 링커는 “/ ignore : XXX”옵션을 무시하고 오류가없고 효과가 없습니다.


답변

PDB 파일은 일반적으로 디버그 정보를 저장하는 데 사용됩니다. 이 경고는 vc80.pdb대상 오브젝트 파일을 링크 할 때 파일을 찾을 수 없기 때문에 발생 합니다. 여기 에서 LNK4099의 MSDN 항목을 읽어 보십시오 .

또는 프로젝트 속성> 링커> 디버깅> 디버그 정보 생성 필드에서 디버그 정보 생성을 끌 수 있습니다.


답변

편집 : vc80 / Visual Studio 2005를 사용하지 말고 Visual Studio 2008 / vc90 버전의 CGAL 라이브러리 를 사용 하십시오 (아마 여기에서 ).

링커 도구 경고 LNK4099 :

/ Z7을 사용하여 컴파일 할 수도 있으므로 pdb를 사용할 필요가 없습니다. 링크하는 개체에 대한 .pdb 파일이없는 경우 / DEBUG 링커 옵션을 제거하십시오.