반응형

오류	C2857	/Ycpch.h 명령줄 옵션과 함께 지정한 '#include' 문이 소스 파일에 없습니다.

 

오늘 프로그래밍 도중에 이런 오류가 떴다..

일단 나의 경우에는 파일 분할 때문에 정리할려고 include, source 폴더를 만들고 거기에 있는 것을 가져오는 방식으로 구현할려고 했다.

그런데 이런 문제가 발생해서 검색해보니.. 모든 사람들이 그냥 미리 컴파일 된 헤더를 비활성화 하라고 한다..

나는 미리 컴파일 된 헤더를 활성화 시킬려고 하는건데..

 

아무튼 원인은 잘 모르겠지만

#include "pch.h" <- *.h 파일
#include "../include/pch.h" <- *.cpp 파일

각 파일에는 위에 적힌 대로 있다. 

그런데 문제는

이 미리 컴파일 된 헤더 파일 이름이 pch.h로만 되어있는데 저게 그대로 include가 되어있는지를 감지하고 안되어있으면 저런 오류를 뱉어내는 것 같다.

그래서 미리 컴파일 된 헤더 파일 이름을 ../include/pch.h로 해봐도 .h 파일 쪽에 문제가 있을테니.. 할 수 있는 방법은 없었다.

 

그러다가 생각난게 다른 라이브러리를 연결할 때 C/C++일반에서 추가 포함 디렉터리를 사용해야한다는게 생각나서 include 폴더 경로를 C/C++일반추가 포함 디렉터리에 추가를 한 후에 이렇게 하면 어차피 ../include 같은건 자동으로 되니깐 .cpp 파일에서 모두 수정하고 실행하니 해결되었다!

$(ProjectDir)\include

위에 이건 프로젝트 경로 안의 include 폴더를 지정하도록 하는 그런거다.

 

그리고 이런 오류가 뜨는 경우도 있는데 그냥 이건 pch.cpp 파일이나 stdafx.cpp 파일의 속성에서 

"사용(/Yu)"로 되어있을 텐데 "만들기(/Yc)"로 안해서 이다. "만들기(/Yc)"로 변경해주면 끝

 

그리고 $(ProjectDir) 같은건 여기에 보면 잘 설명 되어있다.

https://learn.microsoft.com/en-us/cpp/build/reference/common-macros-for-build-commands-and-properties?view=msvc-170

 

Common macros for MSBuild commands and properties

Learn more about: Common macros for MSBuild commands and properties

learn.microsoft.com

 

반응형
반응형

오늘 WinRT로 프로젝트를 제작하면서 OpenCV를 사용해야해서 OpenCV 코드를 작성하고 컴파일을 했는데 컴파일은 분명 잘되는데 프로그램을 실행하면서 처음에는 잘 되다가 다시 실행하면 아래 사진 처럼 오류가 난다.. 도무지 모르겠는데.. 그러다가 12시간 동안 뭔 문제인지 찾다가 알아냈다. (참고로 진짜 12시간 걸렸다.)

Windows 스토어 응용 프로그램 'APP_ID'을(를) 활성화할 수 없습니다. 활성화 요청이 실패했습니다(오류: '앱이 시작되지 않았습니다').

문제 해결에 필요한 정보는 도움말을 참조하십시오.

 

일단 이 원인.. 잘은 모르겠지만 프로그램을 실행하는 도중에 Console 창에서 오류가 나는걸 못 띄우니 여기에서라도 실행할 때 오류를 띄우는 것 같다. 그렇다 보니 원인도 모르겠고.. 

디버깅을 할려고 해도 처음부터 저게 떠버려서 디버깅도 할 수가 없었다..

 

아무튼 방법은 찾았는데 그냥 OpenCV dll 파일이 없어서였다.. (왜 이것 때문에.. 12시간을 고생한거지;;)

 

OpenCV VCPKG WinRT용 설치

일단 한가지 알아낸 것이 있는데 WinRT에서 OpenCV를 돌릴려면 WinRT 용으로 바꿔야하는 것 같다.

WinRT는 UWP로 뭐 돌아가는건데 VCPKG에서 UWP로 설치하는 버전이 있다.

설치는 아래처럼 하면 된다.

vcpkg install opencv4:x64-uwp

이런식으로 설치하면 uwp 버전으로 설치가 된다.

 

오류 해결

앞에서 말했 듯이 그냥 이건 dll 파일이 없어서 생긴 오류이다. 실행에 필요한 dll 파일을 아래 경로에 붙여넣기 하면 오류가 해결된다.

<ProjectName>\x64\Release\<ProjectName>\AppX

그런데 한가지 문제가 있다.. 빌드 할 때마다 dll 파일이 사라져서 자동으로 복붙이 되게 해야하는데

이럴 때는 방법이 있다. 

 

한가지는 그냥 Visual Studio 프로젝트 파일에서 새 필터로 dll 파일 추가해서 하는 방법이 있는데 이건 비추하고..

다른 방법으로는 자동으로 복붙되게 하는 것이다.

 

일단 프로젝트 파일을 오른쪽 클릭하고 속성을 열어서 나오는 창에서

빌드 이벤트의 빌드 후 이벤트로 들어간다.

들어가게 되면 명령줄이 있는데 여기에 코드만 넣으면 된다.

 

일단 빌드 후 이벤트는 말그대로 빌드가 된 후에 자동으로 명령줄에 있는걸 실행하게 되는 것이다.

 

코드는 이걸 넣으면 된다!

xcopy /y "$(OutDir)\*.dll" "$(OutDir)\AppX"

일단 내가 대충 만들어서 해봤을 때 되는 코드이니.. 이게 잘 되는 코드인지는 모르겠다만.. 아무튼 난 저걸 명령줄에 넣어서 했더니 자동으로 복붙이 되었고 해결이 되었다.

 

코드는 대충 AppX에는 dll이 없지만 다행이도 출력 폴더에는 dll 파일이 있다. 그래서 모든 dll 파일을 가지고 AppX 폴더로 붙여 넣는 코드이다.

 

아무튼 이걸로 해결!

반응형
반응형

원인

필요한 헤더파일이 안불러와진 것..

 

문제

WinRT로 프로그램을 만드는 중에.. 어떤 오류가 발생했다.. 

심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
오류 C3779 'winrt::impl::consume_Windows_UI_Input_IPointerPoint<winrt::Windows::UI::Input::IPointerPoint>::Position': 'auto'을(를) 반환하는 함수를 정의되기 전에 사용할 수 없습니다.	ScaraGUIController	C:\Users\PKDPMS0328\source\repos\ScaraGUIController\ScaraGUIController\MainPage.cpp 22

이 오류는 WinRT 부분에서만 일어나는 오류 같은데.. 블로그나 해결 방법은 잘 안나와 있어서.. 일단 마이크로소프트 문서에 검색해보니..

https://learn.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-2/compiler-error-c3779

 

컴파일러 오류 C3779

자세한 정보: 컴파일러 오류 C3779

learn.microsoft.com

해결 방법은 다행히 있었다..!

 

해결방법

어쨋든 내 코드의 경우 

#include <winrt/Windows.UI.Xaml.Input.h>

void function(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) {
	winrt::Windows::UI::Input::PointerPoint point = e.GetCurrentPoint(ControlJoint());
    
    	Point_X().Text(winrt::to_hstring(point.Position().X));
    	Point_Y().Text(winrt::to_hstring(point.Position().Y));
}

대충 이런식의 코드인데.. 여기에서 오류가 난 부분은 point.Position().X 저쪽 부분이다..

여기에서 문제의 저 오류에 winrt::Windows::UI::Input::IPointerPoint 이런게 뭐가 문제가 있다면서 알려주는데

이것을 헤더파일에 추가하면 문제가 해결되는 것이였다..!

 

그래서 나의 경우에는 IPointerPoint는 Input 헤더 안에 있는 것이기 때문에 

#include <winrt/Windows.UI.Input.h> 이 코드로 헤더파일을 추가해서 해결했다..!

#include <winrt/Windows.UI.Xaml.Input.h>
#include <winrt/Windows.UI.Input.h> // 오류 해결에 필요한 헤더파일

void function(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) {
	winrt::Windows::UI::Input::PointerPoint point = e.GetCurrentPoint(ControlJoint());
    
    	Point_X().Text(winrt::to_hstring(point.Position().X));
    	Point_Y().Text(winrt::to_hstring(point.Position().Y));
}

 

결론

'winrt::impl::consume_Windows_UI_Input_IPointerPoint<winrt::Windows::UI::Input::IPointerPoint>::Position': 'auto'을(를) 반환하는 함수를 정의되기 전에 사용할 수 없습니다.

 

이런식으로 오류가 뜰 경우

1.  <winrt::Windows::UI::Input::IPointerPoint> 부분이 자신의 오류에서 뭐인지 찾는다.

2. winrt::Windows::UI::Input::IPointerPoint 이것에 해당하는 헤더파일을 찾는다. 보통은 맨 뒤에꺼 지운게 아마 헤더파일일 꺼다.. winrt::Windows::UI::Input 여기까지, 그리고 헤더파일로 할 경우 winrt/Windows.UI.Input.h

3. 찾은 헤더파일을 추가해서 문제를 해결한다!!!!

 

근데.. 애초에 Input::PointerPoint가 필요한 헤더파일이 winrt/Windows.UI.Input.h였다.. winrt/Windows.UI.Xaml.Input.h가 아닌... 그냥.. 필요한 헤더파일을 안불러왔었던 것.. 

반응형
반응형

그저께 부턴가 윈도우 업데이트 하면서 갑자기 이런 오류가 꺼도 꺼도 계속 떴다..

찾아보니 NProtect가 날뛰고 있던 것.. 은행 백신 때문에 깐 거였는데..

 

바로 지워버리니 해결..

반응형
반응형

요약 및 해결 방법

YOLO에서 학습시킬 때 파라미터에 workers를 자신의 사양에 맞게 바꾸면 된다.

train(data = data, epochs = 100, workers=<사양에 맞게 ex) 0>)

yolo train data=data epochs=100 workers=0

 

본문

인공지능을 학습할려는데 보통 윈도우로 학습하는데.. 왜 사람들이 리눅스로 학습하는지 알고 싶어서 WSL를 설치해서 CUDA 연결하고 리눅스로 YOLO를 학습 시켜보았다. 다른 학생 프로젝트 때문에

 

그런데 학습 시키는 과정에서 아래와 같은 오류가 발생했다.

CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

이 오류를 보면 CUDA_LAUNCH_BLOCKING 이거를 1로 활성화 시켜서 디버깅을 해보라고 되어있는데.. 저걸 하면 자세히 오류가 뜨기는 뜬다.. 근데 자세히 뜨기는 떠도 그냥 메모리가 모잘르다는 것 같았다.

(CUDA_LAUNCH_BLOCKING이거.. CUDA끄고 실행하는 것 같은데.. 저것 때문에 학습 속도가 엄청 느려져서.. 오류 뜰때까지 기다리는게 으음..)

 

근데 전혀 모잘르지는 않았다. 램을 많이 쓰는 것 같지만 램이 최대까지 쓰는걸 보지는 못했고 70%정도 까지만 쓰는걸로 확인이 되어서 이 문제는 아닌 것 같아서.. 여러 해결 방법을 보긴 했다.

어디서는 리눅스에 뭔가 제한이 걸려 있어서 .wslconfig로 제한을 풀거나 하는 시도로 해결했다라는 글도 보고

그냥 WSL 포기하고 리눅스로 해서 해결했다는 글도 있고..

 

근데 나는 wslconfig도 안되고 리눅스로 바꾸는 것도 할 수가 없다.

그러다가 어디선가 workers를 0으로 해보라는 글이 있어서 해봤는데.. 정상적으로 돌아갔다.

 

대충 workers의 역할이 데이터를 로드 시키면서 여러 작업들의 속도를 병렬로 처리할 수 있게 하는 것 같은데 그 뒤에 숫자는 병렬 처리하는 갯수인 걸로 짐작하긴 했는데.. 

 

왜 오류가 나는지 공식 홈페이지를 확인해보니..

https://docs.ultralytics.com/modes/train/#arguments

 

Train

Step-by-step guide to train YOLOv8 models with Ultralytics YOLO including examples of single-GPU and multi-GPU training

docs.ultralytics.com

기본적으로 값이 8이다..

하하하 저것 때문에 윈도우로 돌려서.. 조금 빡치긴 했었는데.. 일단 그래도 해결은 했다.

 

저거 값을 수정하는 과정에서 알게된건 Windows나 Linux에서는 높게 잡아도 자동으로 잡아주는 것 같은데 WSL에서만 안되는 것 같다.

그래서 하나씩 값을 높여보면서 딱 적당한 값을 찾는게 좋을 것 같다.

나는 1로 설정했는데 0으로 했을 때 40초가 나왔었는데 33초로 줄었다..

 

암튼 해결 CUDA_LAUNCH_BLOCKING

반응형

'오류 | 문제 > Python' 카테고리의 다른 글

파이썬 실행 터미널 창 변경하기  (0) 2022.07.11
반응형

OpenCV와 Dlib로 프로젝트를 제작 중에..

기이한 현상이 발견됬다..

 

cv::Mat CVImage = dlib::toMat(DlibImage);
cv::cvtColor(CVImage, CVImage, cv::COLOR_RGB2BGR);

여기에서 저 2개의 명령어를 본다면.. 첫번째 명령어는 DlibImage를 OpenCV의 Mat 이미지인 CVImage로 바꾸는데..

보통 이렇게 바꾸면 RGB 이미지가 CVImage에 할당이 된다..

그런데 내 프로젝트가 전체적으로 BGR이다 보니깐.. RGB를 BGR로 변환을 해야해서 cvtColor로 RGB에서 BGR로 바꾸는 명령어를 쳐서 실행했는데..

 

이상하게 첫번째에 실행하면 괜찮다가.. 두번째에 실행하니깐 RGB가 RGB로 출력되는 것이다..

이유는 잘은 모르겠지만.. cvtColor가 오류를 일으켰거나 RGB와 BGR이 서로 할당되고 그러면서 충돌이 일어난 것 같다.. 난 cvtColor에 문제가 있는 것 같다 생각은 든다..

 

즉 실행하면 실행할 수록 BGR > RGB > BGR > RGB > BGR 이런식으로 계속 번갈아가며 출력되는 것..

 

그래서 내가 해결한 방법은.. 애초부터 RGB이미지를 안쓰기로 해서.. 그냥 이미지 변환안하고 바로 썼다..

그러니깐 잘된다..

 

으음..

아직도 뭔 문제인지 모르겠다.. RG를 BGR로 바꿀때의 문제들은 해외 커뮤니티에서 보긴 했는데..

 

내 OpenCV 버전이 낮아서 그런건가.. 그래도 최신껄로 깔았는데.. 뭐가 문제인건지..

 

해결했던 방법..

그냥 RGB 안쓰고 애초에 처음부터 BGR로 되게 작업..

반응형
반응형

프로젝트 제작중에 

cv::Mat A, B;
A = B;

이렇게 B의 이미지 데이터를 A로 넘기는걸 써봤다..

근데 문제가 생긴다..

 

나중에 A의 이미지를 다른걸로 바꾸면 B가 이상하게 바뀐다는 것이다..

분명 B의 이미지를 A로 넘기는 것 밖에 안했는데 바뀌는..

 

그래서 ChatGPT에 물어보니 이미지 데이터를 보내는게 아니고 참조를 한다고 한다.. 대충 A와 B는 같은 메모리를 사용하게 하는 그런건가..? 암튼 저렇게 하면 A가 B의 이미지 데이터를 참조하도록 되기 때문에.. A를 바꾸면 B가 같이 바뀌는 것이였다.. 으으

 

그래서 해결 방법은 2가지가 있는데

cv::Mat A, B;
A.copyTo(B);

이렇게 하는 방법이 있다. A의 이미지 데이터를 B로 넘긴다는 뜻!

또 다른 방법은

cv::Mat A, B;
B = A.clone();

A의 이미지를 복제해서 B로 넣는 것..

 

근데 난 의미상으론 복사를 써야하기 때문에.. 첫번째 방법으로 썼다..

암튼 끝!

반응형
반응형

학교에서 내준 프로젝트를 계속 만들기 위해 방학에도 계속 이어나가고 있다.

그런데 만들다가.. Dlib에서 deserialize라는 함수에 모델 파일을 넣을 때 오류가 난 것이다..

 

왜 그런가.. 하는데 debug 모드에선 this가 nullptr를 가르키고 있다 하고 release 모드에선 예외가 발생했다 하고..

예외 발생(0x00007FF69400D3D3, program.exe): 0xC0000005: 0x0000000000000008 위치를 읽는 동안 액세스 위반이 발생했습니다..

이런식으로..

그래서 뭔 문제인가 보니..

 

이전 프로젝트 같은 경우 정상적으로 됬는데 이번꺼만 안되었다..

왤까 하고 생각해보니 이전껀 포인터를 몰라서 안썼는데 이번껀 포인터를 좀 써봐서 안됬던 것 같은 생각이 떠올랐다..

 

그래서 포인터로 변수 만들때 * 기호를 제거하니.. 되네.. 하하하하하 왜 이걸로 2일을 존버 탄걸까..

 

dlib::shape_predictor* sp;

dlib::deserialize(spPath) >> *sp;

이런식으로 변수를 생성하고 deserialize로 모델을 로드하니 안됬었다..

그래서 그냥 포인터를 제거하니깐 아주 잘된다.. 하하하하하하

 

그래서 난 이런식으로 주석을 했다.

//이거 모델 로드 할때 포인터 쓰면 오류남
dlib::shape_predictor sp; //68점 찍는거

if (modelFileCheck(spPath))
	//dlib::deserialize(spPath) >> sp;

 

요약

Dlib에서 모델 파일 불러올 때 (dlib::deserialize) 이걸로 뭔 이상한 오류 뜨면 포인터를 제거해봐야 한다..

 

(근데 아직도 포인터의 정확한 개념과 사용방법은 몰라서 저게 왜 되는지도 모르겠다.. 흐으억)

반응형

+ Recent posts