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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12922정성태1/14/202216310개발 환경 구성: 625. AKS - Azure Kubernetes Service 생성 및 SLO/SLA 변경 방법
12921정성태1/14/202213222개발 환경 구성: 624. Docker Desktop에서 별도 서버에 설치한 docker registry에 이미지 올리는 방법
12920정성태1/14/202214622오류 유형: 786. Camtasia - An error occurred with the camera: Failed to Add Video Sampler.
12919정성태1/13/202214109Windows: 199. Host Network Service (HNS)에 의해서 점유되는 포트
12918정성태1/13/202214996Linux: 47. WSL - shell script에서 설정한 환경 변수가 스크립트 실행 후 반영되지 않는 문제
12917정성태1/12/202214347오류 유형: 785. C# - The type or namespace name '...' could not be found (are you missing a using directive or an assembly reference?)
12916정성태1/12/202213418오류 유형: 784. TFS - One or more source control bindings for this solution are not valid and are listed below.
12915정성태1/11/202214311오류 유형: 783. Visual Studio - We didn't find any interpreters
12914정성태1/11/202217797VS.NET IDE: 172. 비주얼 스튜디오 2022의 파이선 개발 환경 지원
12913정성태1/11/202218068.NET Framework: 1133. C# - byte * (바이트 포인터)를 FileStream으로 쓰는 방법 [1]
12912정성태1/11/202217423개발 환경 구성: 623. ffmpeg.exe를 사용해 비디오 파일의 이미지를 PGM(Portable Gray Map) 파일 포맷으로 출력하는 방법 [1]
12911정성태1/11/202213775VS.NET IDE: 171. 비주얼 스튜디오 - 더 이상 만들 수 없는 "ASP.NET Core 3.1 Web Application (.NET Framework)" 프로젝트
12910정성태1/10/202214955제니퍼 .NET: 30. 제니퍼 닷넷 적용 사례 (8) - CPU high와 DB 쿼리 성능에 문제가 함께 있는 사이트
12909정성태1/10/202215875오류 유형: 782. Visual Studio 2022 설치 시 "Couldn't install Microsoft.VisualCpp.Redist.14.Latest"
12908정성태1/10/202213131.NET Framework: 1132. C# - ref/out 매개변수의 IL 코드 처리
12907정성태1/9/202214856오류 유형: 781. (youtube-dl.exe) 실행 시 "This app can't run on your PC" / "Access is denied." 오류 발생
12906정성태1/9/202216917.NET Framework: 1131. C# - 네임스페이스까지 동일한 타입을 2개의 DLL에서 제공하는 경우 충돌을 우회하는 방법 [1]파일 다운로드1
12905정성태1/8/202216062오류 유형: 780. Could not load file or assembly 'Microsoft.VisualStudio.TextTemplating.VSHost.15.0, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
12904정성태1/8/202218016개발 환경 구성: 623. Visual Studio 2022 빌드 환경을 위한 github Actions 설정 [1]
12903정성태1/7/202217081.NET Framework: 1130. C# - ELEMENT_TYPE_INTERNAL 유형의 사용 예
12902정성태1/7/202215992오류 유형: 779. SQL 서버 로그인 에러 - provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.
12901정성태1/5/202216884오류 유형: 778. C# - .NET 5+에서 warning CA1416: This call site is reachable on all platforms. '...' is only supported on: 'windows' 경고 발생
12900정성태1/5/202218964개발 환경 구성: 622. vcpkg로 ffmpeg를 빌드하는 경우 생성될 구성 요소 제어하는 방법
12899정성태1/3/202218526개발 환경 구성: 621. windbg에서 python 스크립트 실행하는 방법 - pykd (2)
12898정성태1/2/202219212.NET Framework: 1129. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 인코딩 예제(encode_video.c) [1]파일 다운로드1
12897정성태1/2/202216370.NET Framework: 1128. C# - 화면 캡처한 이미지를 ffmpeg(FFmpeg.AutoGen)로 동영상 처리 [4]파일 다운로드1
... 31  32  33  34  35  36  37  38  39  40  41  [42]  43  44  45  ...