본문 바로가기

Study/C++

[미니 스타듀밸리] 2. GUI 프로젝트 만들고 콘솔과 연동하기

이 포스팅에서 할 일:

1. GUI용 프로젝트 생성 (CLR 빈 프로젝트)

2. CLR프로젝트와 콘솔 빈 프로젝트 연동하기

 

1. GUI용 프로젝트 생성                                                                        

 

> CLR 빈 프로젝트 만들기

 

clr 빈 프로젝트를 만들어 보자. Windows form 만들게.

  1. 솔루션 탐색기- 솔루션 이름 우클릭- 추가- 새 프로젝트 클릭
  2. CLR 빈 프로젝트 선택 - 만들기

 

 

 

> CLR 프로젝트 설정

 

빈 프로젝트를 만들었다. Window form을 쓰려면 설정을 조금 만져줘야 한다.

  1. 솔루션 탐색기 - 프로젝트 이름 우클릭(CLR 프로젝트) - 속성
  2. 구성 속성 - 링커 - 시스템 탭으로 이동하여 하위 시스템으로 바꾼다
  3. 구성 속성 - 링커 - 고급 탭으로 이동하여 진입점을 수정한다 (예: Main)/ main역할을 할 아무 함수 이름을 넣으면 된다.

 

 

> Windows form 추가하기

 

window form을 추가해 보자.

  1. 솔루션 탐색기 - 프로젝트 이름 우클릭 - 추가 - 새 항목
  2. 새 항목 추가 창에서 Visual C++ - CLR 선택
  3. Windows form 선택 후 만들기

를 하면 오류가 뜰 것이다. 당황하지 말고 방금 만든 `Myform.cpp`파일에 아래 코드를 넣어주자.

 

using namespace System;
using namespace System::Windows::Forms;

[STAThreadAttribute]
//Main: 진입점에서 설정한 이름
void Main(array<String^>^ args) {
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false);
    	//Project1: CLR 프로젝트 이름
    	//MyForm: cpp 파일 이름
	Project1::MyForm form;
	Application::Run(%form);
}

 

코드를 추가한 뒤 비주얼 스투디오를 껐다 켜면 오류가 해결되어 있을것이다.

 

GUI 프로젝트를 시작 프로젝트로 설정한 뒤, Ctrl + F5를 누르면 다음과 같이 뜰 것이다. 굿잡!

 


 

2. 콘솔과 GUI 프로젝트 연동하기                                                            

콘솔응용프로그램 프로젝트(.exe)와 GUI 프로젝트를 연동해보자. (같은 솔루션 내 다른 프로젝트 기준)

CLR 프로젝트에서는 콘솔응용프로그램 프로젝트에서 작성한 코드를 갖다 쓸 수 없다.

아예 `.cpp`, `.h`파일을 물리적으로 CLR 프로젝트에도 복사-붙여넣기해줘야 쓸 수 있다.

 

하지만 `.lib`은 복붙할 필요 없이 참조형태로 이용할 수 있다. 그 방법을 알아보자.

 

 

> 콘솔 응용 프로그램(.exe) → 정적 라이브러리(.lib)으로 변경

 

만들어줬던 콘솔 응용 프로그램프로젝트 속성 페이지에서 정적 라이브러리로 바꾼다.

이렇게 하면 그동안처럼 Ctrl+ F5를 눌러 디버깅 할 수 없다. (올바른 애플리케이션이 아니라고 뜸.) 왜? 라이브러리니까.

디버깅 대신 유닛테스트를 통해 이상이 없는지 확인해주어야 한다.

어쩔 수 없다.. CLR에서 cpp로 작성한 콘솔 프로그램을 wrapping없이 쓰려면... 받아들이자..

 

> CLR 프로젝트 참조에 .lib 추가

 

CLR프로젝트 참조에 콘솔응용이었던 .lib을 추가해주자

1. 솔루션 탐색기 - CLR프로젝트 - 참조 - 참조 추가 

 

 

> CLR 프로젝트의 '추가 포함 디렉토리' 수정

 

  1. CLR프로젝트 우클릭 - 속성 - 구성 속성 탭으로 이동
  2. C/C++범주의 일반탭에서 추가 포함 디렉토리 수정
  3. 추가 포함 디렉토리에 다음과 같이 추가 : $(SolutionDir)lib프로젝트이름 //같은 솔루션에 있는 프로젝트를 추가한다는 뜻이다

 

짠!

이제 CLR 프로젝트에서도 다른 프로젝트의 클래스를 쓸 수 있게 되었다.

`#include`로 추가해서 사용하면 된다.

 

 

클래스 템플릿 "std::array"에 대한 인수가 너무 적습니다   오류가 날 때

 

종종 String^>^에 빨간 줄이 쳐지며 인수가 너무 적다는 오류가 날 때가 있다.

원인은 #include한 .h파일에서 using namespace를 쓰고 있기 때문이다.

 

원인 : using namespace std

 

해결 방법은 두 가지다.

  1. 문제있는 .h파일에서 using namespace std를 빼기
  2. void main(array<String^>^ args)에서 안의 파라미터를 다 삭제해버리기 → void main()으로 이용

어떤 방법을 써도 잘 돌아간다.

namespace std를 많이 해 놨다면 그냥 2번 방법을 쓰자. 잘 돌아가니까.

 

2번 방법. 잘 돌아간다.

 

 

 

참고:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e6fbde42-d872-4ab3-8000-41ab22a4a584/visual-studio-2017-windows-forms?forum=winformsdesigner

 

Visual Studio 2017 - Windows Forms

For those who can get it to work and/or have a compile error, try to type "main" in lower case in your form's cpp file (I cannot type upper case in the properties so my project never started the form.cpp). After that comment out the main project's cpp cont

social.msdn.microsoft.com