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


118

내 코드 컴파일의 연결 단계에서이 형식의 많은 연결 경고를 생성하는 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) 라이브러리에 대한 제어 권한이 없습니다. 외부 라이브러리를 다시 컴파일 할 수 없습니다. 따라서 내 끝에서 메시지를 수정할 필요가 있습니다.


1
VS2005 / ignore : 4099의 경우 잘 작동합니다.

/ ignore : 4099는 VS2008에서 잘 작동합니다.

/ignore:4099C ++를 사용하는 Visual Studio 10에서 잘 작동합니다. 나는 경고를 LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)받고 이런 식으로 제거했습니다.
Manolete


3
VS2013는 / 수용 무시 : 4099 잘 :
mlvljr

답변:


101

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

 /ignore:4099

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


5
/ ignore가 존재하지 않는다고 생각합니다. 오류는 여전히 나열되고 / ignore는 MSDN에 문서화되어 있지 않습니다. "경고 LNK4075 : '/ INCREMENTAL : NO'사양으로 인해 '/ EDITANDCONTINUE'무시"에 대해 4075를 비활성화하려고합니다.
Nick Desjardins

1
/ IGNORE는 문서화되어 있지 않지만 사용할 수 있습니다. connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela


7
/ ignore : 4099를 링커 플래그로 사용할 수 있지만 캐치가 있습니다. 불행히도 Microsoft는 4099를 무시할 수없는 경고로 만들기로 결정했기 때문에 link.exe를 패치해야합니다. 좀 이상하게 들리지만 다른 방법은 없습니다. 자세한 내용은 여기를 참조하세요. bottledlight.com/docs/lnk4099.html HxD를 16 진수 편집기로 사용했으며 해당 페이지의 설명을 따르면 VS10에서 제대로 작동했습니다. 주문은 여전히 ​​4088, 4099, 4105입니다.
Andreas Haferburg

2
VS 2015에서 작동 (프로젝트는 VS2013 도구 집합을 사용하고 있지만 차이가 있는지 확실하지 않음)
Assimilater

50

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

그는 "4099 경고는 무시하기에는 너무 중요하다"고 말하지 않습니다. 그는 그것을 끌 수 없다는 사실에서 이것을 추론합니다. (해당 링크에는 추가 정보가 없기 때문에 여기에 기록되어 있습니다.)
벤 M

우려의 @BenM 해결하기 위해 업데이트
존 웰던

1
이 답변은 오래되었습니다 . 경고 4099를 비활성화하면 VS2017에서 잘 작동했습니다. 여기 주석에서 아마도 VS2013부터 비활성화 될 수 있다고 나타납니다.
Mark Ransom

10

(기록을 위해 그리고 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 (존재하지 않음)으로 바꿉니다.


5
시퀀스 F8 0F 00 00-03 10 00 00-09 10 00 00 (리틀 엔디안의 32 비트 더블 워드로 4088, 4099, 4105)을 찾아야합니다. amd64 / link.exe에서도 동일합니다.
Andreas Haferburg 2013 년

8

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

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가 있습니다. 디버그 모드에서 필요한 파일.


2
나는 이것이이다라고 말하고 싶지만 질문에 대답. 많은 답변에 포함 된 PATCHING THE LINKER의 제안은 무의미합니다. Microsoft가이 경고를 무시할 수 없도록 만드는 것에 대해 "잘못"인 경우에도 마찬가지입니다.
Tamás Szelei

3
소스에서 라이브러리를 컴파일하는 경우 올바른 대답입니다. 그러나 일부 프로그램은 .pdb 파일을 포함하지 않는 상용 라이브러리에 종속되어 있으므로 .pdb 파일을 생성하는 것은 옵션이 아닙니다.
Bryce Wagner

3

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


2
무시 플래그가 VC6 후 사용할 그래서 사실은, 링커 경고를 무시하지 enouraged 것 : bytes.com/topic/net/answers/...
규리

/ ignore는 VS2013에서 다시 사용할 수 있습니다.
Fernando Gonzalez Sanchez

1

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

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


3
디버그 정보를 끄면 링커 경고가 해결되지만 디버그 정보 없이는 중단 점이 작동하지 않습니다. 그것은 나에게별로 유용하지 않습니다.
Ashwin Nanjappa

2
경고를 끄는 것은 옳은 일이 아닙니다. 그들을 고쳐라. pdb를 찾아서 적절한 위치에 복사되었는지 확인해야합니다.
부지런히

한숨, 사실입니다! 슬프게도이 경우에는 해당 pdb를 찾을 수 없습니다.
Ashwin Nanjappa

1
vc80.pdb는 vc8의 기본 pdb 이름입니다. 이 경고는 단순히 CGAL 라이브러리에 사용할 수있는 디버그 정보가 없음을 의미합니다. 무시해도 안전합니다.
JoeG

1

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

링커 도구 경고 LNK4099 :

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


2
감사. / Z7로 컴파일하면 여전히 CGAL 라이브러리의 .pdb 파일을 요청합니다. / DEBUG는 링커 경고를 해결하지만 디버그 정보 없이는 중단 점이 작동하지 않습니다.
Ashwin Nanjappa

1

@John Weldon이 말한 것처럼 링커 경고 4099를 비활성화 할 수 없습니다.

일부 프로젝트 구성 변경으로 라이브러리를 다시 빌드해야합니다. 몇 가지 옵션이 있습니다.

  • 디버그 정보가있는 저장 PDB 파일은 .lib 파일을 저장하는 폴더와 동일합니다. "$ (OutDir) $ (TargetName) .pdb"값을 속성-> C / C ++-> 출력 파일-프로그램 데이터베이스 파일 이름으로 설정합니다.
  • .lib 파일에 디버그 정보를 저장합니다. "C7 호환 (/ Z7)"값을 속성-> C / C ++-> 일반-> 디버그 정보 형식으로 설정합니다.
  • 이 라이브러리에 대한 생성 디버그 정보를 비활성화합니다. 속성-> C / C ++-> 일반-> 디버그 정보 형식에서 값 제거
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.