이 포스팅에서 할 일:
1. GUI용 프로젝트 생성 (CLR 빈 프로젝트)
2. CLR프로젝트와 콘솔 빈 프로젝트 연동하기
1. GUI용 프로젝트 생성
> CLR 빈 프로젝트 만들기
clr 빈 프로젝트를 만들어 보자. Windows form 만들게.
- 솔루션 탐색기- 솔루션 이름 우클릭- 추가- 새 프로젝트 클릭
- CLR 빈 프로젝트 선택 - 만들기
> CLR 프로젝트 설정
빈 프로젝트를 만들었다. Window form을 쓰려면 설정을 조금 만져줘야 한다.
- 솔루션 탐색기 - 프로젝트 이름 우클릭(CLR 프로젝트) - 속성
- 구성 속성 - 링커 - 시스템 탭으로 이동하여 하위 시스템을 창으로 바꾼다
- 구성 속성 - 링커 - 고급 탭으로 이동하여 진입점을 수정한다 (예: Main)/ main역할을 할 아무 함수 이름을 넣으면 된다.
> Windows form 추가하기
window form을 추가해 보자.
- 솔루션 탐색기 - 프로젝트 이름 우클릭 - 추가 - 새 항목
- 새 항목 추가 창에서 Visual C++ - CLR 선택
- 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 프로젝트의 '추가 포함 디렉토리' 수정
- CLR프로젝트 우클릭 - 속성 - 구성 속성 탭으로 이동
- C/C++범주의 일반탭에서 추가 포함 디렉토리 수정
- 추가 포함 디렉토리에 다음과 같이 추가 : $(SolutionDir)lib프로젝트이름 //같은 솔루션에 있는 프로젝트를 추가한다는 뜻이다
짠!
이제 CLR 프로젝트에서도 다른 프로젝트의 클래스를 쓸 수 있게 되었다.
`#include`로 추가해서 사용하면 된다.
클래스 템플릿 "std::array"에 대한 인수가 너무 적습니다 오류가 날 때
종종 String^>^에 빨간 줄이 쳐지며 인수가 너무 적다는 오류가 날 때가 있다.
원인은 #include한 .h파일에서 using namespace를 쓰고 있기 때문이다.
해결 방법은 두 가지다.
- 문제있는 .h파일에서 using namespace std를 빼기
- void main(array<String^>^ args)에서 안의 파라미터를 다 삭제해버리기 → void main()으로 이용
어떤 방법을 써도 잘 돌아간다.
namespace std를 많이 해 놨다면 그냥 2번 방법을 쓰자. 잘 돌아가니까.
참고:
'Study > C++' 카테고리의 다른 글
[미니 스타듀밸리] 3. GUI창 상황에 맞게 펼치기 (0) | 2019.06.26 |
---|---|
[오류] 클래스 템플릿 "std::array"에 대한 인수가 너무 적습니다 (0) | 2019.06.26 |
[미니 스타듀밸리] 1. 프로젝트 생성 & 클래스 다이어그램 그리기 (0) | 2019.06.25 |
[미니 스타듀밸리] 0. 준비 (0) | 2019.06.24 |
error C2143: 구문 오류 : ';'이(가) '*' 앞에 없습니다. (0) | 2019.06.04 |