Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

Visual C++ - MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance

이전 글의 실습에서,

Visual C++ - .NET Core의 nethost.lib와 정적 링크
; https://www.sysnet.pe.kr/2/0/12419

마지막으로 남은 링커 경고를 정리해 보겠습니다.

1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>pch.cpp
1>dllmain.cpp
1>ConsoleApplication1.cpp
1>platform.cpp
1>Generating Code...
1>libnethost.lib(nethost.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
1>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification
1>   Creating library E:\temp\x64\Debug\ConsoleApplication1.lib and object E:\temp\x64\Debug\ConsoleApplication1.exp
1>MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Generating code
1>Finished generating code
1>ConsoleApplication1.vcxproj -> E:\temp\x64\Debug\ConsoleApplication1.dll
1>Done building project "ConsoleApplication1.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

위에서 LNK4075는 전에도 한번 언급했습니다.

Orcas - ComUtil로 인한 증분(/INCREMENTAL) 링크 옵션 사용 제한
; https://www.sysnet.pe.kr/2/0/499

그러니까, libnethost.lib가 /GL 옵션(Whole Program Optimization)으로 빌드된 모듈이라 그것을 사용하는 측에서는 /LTCG(Link Time Code Generation) 링크를 하게 된다는 의미입니다. 따라서 어차피 사용하게 되는 거 우리 측도 /LTCG 옵션을 켜라는 건데요, 어쩔 수 없습니다. (아니면 그냥 경고를 계속 빌드 때마다 보면 됩니다.)

어쨌든, Linker / Optimization의 "Link Time Code Generation"을 켜면 이제 빌드 경고가 하나 줄어듭니다.

1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>pch.cpp
1>dllmain.cpp
1>ConsoleApplication1.cpp
1>platform.cpp
1>Generating Code...
1>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification
1>   Creating library E:\temp\x64\Debug\ConsoleApplication1.lib and object E:\temp\x64\Debug\ConsoleApplication1.exp
1>MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Generating code
1>Finished generating code
1>ConsoleApplication1.vcxproj -> E:\temp\x64\Debug\ConsoleApplication1.dll
1>Done building project "ConsoleApplication1.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

그런데, 이제는 /LTCG를 켰다고 해서 증분 링크 기능을 무시하겠다는 경고를 보냅니다. 이 경고도 없애고 싶다면 Linker / General의 "Enable Incremental Linking"을 "No (/INCREMENTAL:NO)"로 설정하면 됩니다. 하지만, 이렇게 하면 다시 이로 인해 /EDITANDCONTINUE 기능을 무시한다고 알립니다.

1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>pch.cpp
1>dllmain.cpp
1>ConsoleApplication1.cpp
1>platform.cpp
1>Generating Code...
1>dllmain.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
1>   Creating library E:\temp\x64\Debug\ConsoleApplication1.lib and object E:\temp\x64\Debug\ConsoleApplication1.exp
1>MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Generating code
1>Finished generating code
1>ConsoleApplication1.vcxproj -> E:\temp\x64\Debug\ConsoleApplication1.dll
1>Done building project "ConsoleApplication1.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

그리고 이 경고를 없애려면, 링커가 아닌 "C/C++"의 "General"에서 "Debug Information Format" 설정을 "Program Dtabase for Edit And Continue (/ZI)"에서 "Program Database (/Zi)"로 낮춰야 합니다."

그럼, 결국 /GL로 시작한 링커 경고는 이렇게 마무리가 됩니다.

1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>pch.cpp
1>dllmain.cpp
1>ConsoleApplication1.cpp
1>platform.cpp
1>Generating Code...
1>   Creating library E:\temp\x64\Debug\ConsoleApplication1.lib and object E:\temp\x64\Debug\ConsoleApplication1.exp
1>MSVCRTD.lib(initializers.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Generating code
1>Finished generating code
1>ConsoleApplication1.vcxproj -> E:\temp\x64\Debug\ConsoleApplication1.dll
1>Done building project "ConsoleApplication1.vcxproj".
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

그런데, 과연 이것이 어떤 의미가 있는 걸까요? 주요 원인인 libnethost.lib가 /GL 빌드된 것으로 인해, 이후 "디버그 편의성을 위한 옵션"들을 전부 꺼야 하는 상황이 된 것입니다.

따라서, 이 문제를 근본적으로 해결하려면 라이브러리(이 글에서는 libnethost.lib) 개발자 측에서 디버그 빌드와 릴리스 빌드를 따로 제공해 주는 것이 좋습니다. 실제로 "Orcas - ComUtil로 인한 증분(/INCREMENTAL) 링크 옵션 사용 제한" 글에서 링크했던 "comsuppw.lib"는 그것의 디버그 빌드 버전으로 "comsuppwd.lib"를 제공해 주고 있습니다. 그리고 그때 (베타) 당시에는 디버그 빌드 버전에도 /GL 링크를 해 문제가 되었지만, 지금 그 프로젝트를 빌드하면 그런 오류가 발생하지 않습니다.

어쨌든, 저 경고들은 전체적인 프로그램 개발에 영향을 주지 않지만, 개발의 편의성을 떨어뜨리는 결과를 가져오는 것에 불과하므로 무시해도 상관없습니다.




자, 그럼 마지막 LNK4098도 살짝 손봐야겠죠. 이에 대해서는 예전에도 다뤘듯이,

LINK : warning LNK4098: defaultlib 'nafxcw.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
; https://www.sysnet.pe.kr/2/0/12156

"/NODEFAULTLIB:libcmt.lib" 옵션을 주면 됩니다. 그럼, 이제 비로소 깨끗한 빌드 메시지를 접하게 될 것입니다. ^^

Rebuild started...
1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1>pch.cpp
1>dllmain.cpp
1>ConsoleApplication1.cpp
1>platform.cpp
1>Generating Code...
1>   Creating library E:\temp\x64\Debug\ConsoleApplication1.lib and object E:\temp\x64\Debug\ConsoleApplication1.exp
1>Generating code
1>Finished generating code
1>ConsoleApplication1.vcxproj -> E:\temp\x64\Debug\ConsoleApplication1.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/19/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11105정성태11/8/201620960.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제
11104정성태11/8/201619857개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제
11103정성태11/8/201620364오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생
11102정성태11/8/201620385오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생
11101정성태11/8/201622604.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363
11100정성태11/7/201630197개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]
11099정성태11/7/201632045.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드파일 다운로드1
11098정성태11/7/201621297오류 유형: 368. 빌드 이벤트에서 robocopy 사용 시 $(TargetDir) 매크로를 지정하는 경우 오류 발생
11097정성태11/7/201624321오류 유형: 367. go install: no install location for directory [...경로...] outside GOPATH
11096정성태11/6/201627801디버깅 기술: 83. PDB 파일을 수동으로 다운로드하는 방법
11095정성태11/6/201624424.NET Framework: 619. C# - Cognitive Services 중의 하나인 Face API를 사용해 얼굴 인식 및 흐림(blur) 효과 적용 [1]파일 다운로드1
11094정성태11/5/201626130VC++: 105. Visual Studio 2013/2015 - Ceemple OpenCV 확장을 이용한 웹캠 영상 출력
11093정성태11/4/201625980웹: 34. Edge 브라우저도 지원하는 클립보드 복사를 위한 자바스크립트 코드
11092정성태11/3/201633092.NET Framework: 618. C# - NAudio를 이용한 MP3 파일 재생 [5]파일 다운로드1
11091정성태11/3/201626946VC++: 104. std::call_once를 이용해 thread-safe한 Singleton 객체 생성파일 다운로드1
11090정성태11/1/201628459VC++: 103. C++ CreateTimerQueue, CreateTimerQueueTimer 예제 코드 [9]파일 다운로드1
11089정성태11/1/201628240디버깅 기술: 82. Windows 10을 위한 Symbol(PDB) 파일 내려받는 방법 [2]
11088정성태11/1/201631464.NET Framework: 617. C# - AForge.NET을 이용한 MP4 동영상 파일 재생 [7]파일 다운로드1
11087정성태11/1/201625747.NET Framework: 616. AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법파일 다운로드1
11086정성태11/1/201620093오류 유형: 366. The Microsoft Passport Container service terminated with the following error: General access denied error
11085정성태10/27/201634872.NET Framework: 615. C# - AForge.NET을 이용한 웹캠 영상 출력 [2]파일 다운로드1
11084정성태10/26/201622826오류 유형: 365. The User Profile Service service failed to the sign-in.
11083정성태10/26/201629056Windows: 131. 윈도우 10에서 사라진 "Adapters and Bindings" 네트워크 우선 순위 조정 기능 [1]
11082정성태10/26/201631329.NET Framework: 614. C# - DateTime.Ticks의 정밀도 [4]파일 다운로드1
11081정성태10/26/201621467오류 유형: 364. You need to fix your Microsoft Account for apps on your other devices to be able to launch apps and continue experiences on this device.
11080정성태10/24/201624864Windows: 130. Windows Server 2016 Nano 서버 설치 방법
... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...