티스토리 뷰

기존 MinGW의 gcc를 이용한 개발환경구성을 포스팅했었다.
http://hyogeun.tistory.com/27

이번엔 gcc를 따로 설치하지 않고, 일반적으로 많이 사용하는 MS visual studio에 포함되어 있는 Visual C++ 컴파일러(cl.exe)를 이용한  컴파일을 알아 보도록 한다.

Editplus에서의 셋팅전에 cl.exe 을 사용할 수 있도록 PATH를 지정해줘야 한다.

현재 사용하고 있는 IDE(Integrated Development Environment)는 MS의 Visual Studio 2010이다.


Visual studio를 설치하게 되면 시작프로그램 visual studio tools에 전용 명령프롬프트가 설치 된다.


이것은 visual studio 를 사용하기 위해 모든 path가 지정된 명령 프롬프트로 우리가 일반적으로 사용하는 cmd(command)에서 path를 지정해 준것과 같다.

그렇기 때문에 editplus에서의 셋팅전에 일반적인 커맨드를 visual studio 명령프롬프트로 만들어 주면 editplus 뿐만 아니라 어디서든지 컴파일러를 사용할 수 있다.

Visual Studio에서 사용하는 컴파일러는 cl.exe 이다.
이것의 경로는
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
에 위치한다. (필자는 Windows7 64bit, 다른 운영체제도 별로 다르지 않을것이라고 생각 됨)

path를 지정하기 위해 시스템변수에 경로를 추가해줘야하는데, 환경변수에는 사용자 변수와 시스템변수가 있다. 어느곳에 추가하든 상관은 없지만 사용자변수에 추가할 시 로그오프 후 다시 로그온 해줘야 변수설정이 적용된다.



사용하기 편하게 하기 위해

새로만들기를 선택하여 VisualStudio 전용 변수를 만들어준다.(그냥 path에 적어도 됨)


그 후 Path를 편집하여 VisualStudio 변수를 추가 해준다. (변수를 사용하기 이해서는 %변수이름%를 적는다.)



이렇게 적어주고 커맨드에서 cl.exe 를 실행하게 되면


다음과 같은 메시지박스가 뜨게 되는데, 이것은 DLL(Dynamic Link Library)인 mspdb100.dll을 찾을 수 없다는 메시지이다.
일반적으로 윈도우 실행파일 (PE, Portable Executable)을 링크할 때 사용되는 라이브러리는 DLL과 LIB파일이다. 하지만 LIB는 주로 PE파일속으로 포함되지만, DLL은 포함되지 않고 같은 폴더, 혹은 지정된 폴더에 있어야 PE가 실행될 때 DLL파일을 참고하여 루틴들을 검색하게 된다.

그럼 이 DLL은 어디에 위치하는지 알아보면,

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
에 위치한다.

그래서 다시 환경변수의 VisualStudio 변수에 추가를 해주면 되는데, 그 후 커맨드를 실행하여 cl.exe를 실행하면


다음과 같이 실행되는 것을 볼 수 있다.


그럼 이제 다음과 같은 파일을 컴파일 해보도록 하자.


우잉? stdio.h가 없다고 한다. 우리가 일반적으로 c를 코딩할 때 가장먼저 포함시키는 헤더파일인 standard input output 헤더파일인데 이것이 없다니.
이 파일은
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include

폴더에 위치하는데, path로 지정해 주면 안돼고 include라는 변수로 만들어 주어야 한다.


다음과 같이 include 변수를 추가하여 값을 설정해 주면 돼고, 이제 다시 cl.exe를 이용하여 컴파일 하게 되면


이번엔 LIBCMT.lib가 없다고 한다. 이런. 일반적으로 PE파일은 lib가 포함돼지만, cl.exe은 포함안되어 있나 보다.

그리하여 lib 변수를 추가하여 값을 설정해 준다.

이 파일은
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib
에 위치한다.

 


하지만 kernal32.lib파일도 필요하다고 한다.
이 파일은
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib
에 위치한다. (windows7 기준이고, 다른 OS는 잘 모르겠음)

그리하여 마지막으로 이 kernal32.lib의 경로도 lib변수에 저장을 해준다.



이제 준비는 끝났고, cl.exe 을 이용해 컴파일하게 되면



이렇게 컴파일돼어 obj파일이 생성돼고, 링커까지 자동으로 돼어 exe파일이 생성된다. (컴파일만 실행은 /c 옵션)

*include 변수와 lib변수를 추가하는 과정에서, 위에서 설명한 방법은 필요한 파일만 찾아 추가하는 방법을 취했지만, visual studio2010의 명령프롬프트와 동일한 환경을 만들어 주기 이해서는 visual studio2010 명령프롬프트를 실행한 뒤
echo %include%
echo %lib%
를 샐행하게 되면 visual studio2010명령프롬프트의 설정을 확인할 수가 있다.
이것을 복사하여 include, lib 변수를 만들어 주면 더 쉽게 설정할 수가 있다.



그럼 이제 command는 visual studio 2010 명령프롬프트와 동일한 환경변수를 갖게 되었다.

이제 editplus에 매크로 시켜주면 돼는데

설정은 다음과 같다.



먼저 컴파일 및 링크하는 과정인 cl filename을 매크로 설정해주고


실행과정인 파일이름을 실행시켜 준다. 주의할점은 출력내용캡쳐를 체크하지 않는다는 것이다. (입력 시 프로그램이 죽어버림)


다음으로 /FAs옵션을 사용하여 어셈블러 소스로 만들어 주고,


마지막으로 editplus를 이용하여 어셈블러 소스를 불러 온다.

그렇게 되면
 

; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

	TITLE	C:\Users\Administrator\Desktop\test.c
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

_DATA	SEGMENT
$SG2641	DB	'Hello, world', 0aH, 00H
_DATA	ENDS
PUBLIC	_main
EXTRN	_printf:PROC
; Function compile flags: /Odtp
; File c:\users\administrator\desktop\test.c
_TEXT	SEGMENT
_argc$ = 8						; size = 4
_argv$ = 12						; size = 4
_main	PROC

; 4    : {

	push	ebp
	mov	ebp, esp

; 5    : 	printf("Hello, world\n");

	push	OFFSET $SG2641
	call	_printf
	add	esp, 4

; 6    : 	
; 7    : 	return 0;

	xor	eax, eax

; 8    : }

	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
END


다음과 같은 어셈블러 소스를 확인할 수 있다.


댓글
댓글쓰기 폼