현재 Windows 환경에서 Visual Studio 2017 / C++14 피처를 사용하는 프로젝트이다.
이 프로젝트의 컴파일러와 피처를 업데이트하면서 발생하게 된 에러를 정리해본다.
업데이트 이유는 최신 VS IDE에서 sanitizer도 지원하고 최신 C++ 피처 사용등이 가능하기 때문이다.
(덕분에 템플릿 관련쪽을 concepts으로 바꾸는 작업도 공부할 수 있었다.)
이제 하나씩 정리해보자.
1.c2872 'byte' ambiguous symbol
컴파일시 이런 에러가 발생하는데... byte 키워드가 이상하단다.. 컴파일러의 헤더파일에서 발생한다.
https://developercommunity.visualstudio.com/t/error-c2872-byte-ambiguous-symbol/93889
위와 같이 관련내용을 확인할 수 있다.
필자는 CMakeLists.txt에 _HAS_STD_BYTE=0 의 옵션을 추가하여 해결하였다.
2. __cplusplus 매크로에 대한 사용
컴파일중 #if.. 로 이루어져 있는데 __cplusplus 매크로를 사용하고 있다. 문제는 전처리시 값이 이상하게 되어 있는지 VS에서 C++ 피처 옵션에 따라 별 반응이 없다.
위 링크대로 VS의 버그로 되어있으니 /Zc:__cplusplus 옵션을 명시적으로 활성화 하였다.
3.c2440 'initializing' cannot convert from
이는 VS 19 이상 그리고 C++20 이상이면 자동으로 활성화되며 기존의 const char* 타입이 const char8_t* 타입으로 변한다. 그로인한 문제이다.
위 MSVC 문서에 상세히 설명되어있다.
4. C++20: aggregate initialization error
갑자기 특정 생성자가 있으면서 return {...} 구문에서 컴파일 에러가 발생했다. 집계 생성자 초기화가 안되던거 같은데... 아래 내용을 확인하면 좋다.
위 링크대로 해당 클래스의 생성자쪽을 상황에 맞게 수정하여 해결하였다.
5. ETC
이정도만 수정하여 컴파일 및 빌드까지는 완료되었다.
문데는 컴파일러가 업데이트 되고, sianitizer를 사용하려고 했는데.. 아직 CMake의 설정이 제대로 되지 않아 작업이 좀 더 필요하다.
또한, 템플릿 꼬리표 분배 방식이 필요할 수 있어 작업하다 이거보단 c++20인데 concepts을 사용하면 더 보기 좋을거 같아 작업중이다.
문제는 concpets을 사용하다 보니 라이브러리 빌드는 되는데.. test 바이너리가 빌드에 실패한다.. 고쳐야한다..
관련해서 살펴본 내용은 아래와 같다.
https://learn.microsoft.com/en-us/cpp/sanitizers/error-container-overflow?view=msvc-170
https://cppmagister.tistory.com/26
'C , C++, C#' 카테고리의 다른 글
[gdb] 표준 파일 건너뛰기 (0) | 2024.05.01 |
---|---|
[Vtune] WSL2로 remote ssh 설정하기 (0) | 2023.12.20 |
[Windows C++] 레지스트리 값 읽기 (0) | 2023.09.10 |
[CMake] VS 2022 CMakePresets error using toolset (1) | 2023.06.05 |
[기본] char* / char [] in C (0) | 2023.01.05 |