mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Friday, April 14, 2006

Visual C++ 2003 의 무료 버전 공개, 무료 비주얼 C언어 컴파일러


업데이트:

여기서 설명한 "Microsoft Visual C++ Toolkit 2003"보다 좋은 것이 나왔습니다. "[희소식] 비주얼 스튜디오 무료화 / Visual C++ 2005 Express 등등"



(사실 이것은 오래된 뉴스지만, 지금에야 언급하게 되었음)

마이크로소프트의 무료 C언어 컴파일러 소개




연주가가 좋은 악기를 갖고 싶어 하듯, 프로그래머는 좋은 컴파일러를 가지고 싶어 한다. 컴파일러가 시원찮으면 프로그래머의 기량이 아무리 뛰어나도 훌륭한 프로그램을 만들기 어렵다. Microsoft의 운영체제에서는 Visual C++ 가 최고의 C/C++ 컴파일러라는 사실을 부정할 수 없다.

볼랜드 C++는 이미 존재감이 희미해져 버렸고, GCC는 아직 Win32 환경에 취약하다. 오픈소스 진영에서도 소스를 Win32용으로 컴파일할 때는 Visual C++를 사용하지 GCC를 사용하는 경우는 드물었다. GCC가 아직 x86 + Win32 환경에 최적화되어 있지 않아서일 것이다.

그러나 Visual C++ 가 상당히 비싼 데다가 근래에는 별도로 팔지도 않아서 방대한 "비주얼 스튜디오"를 통째로 구입해야만 한다. 게다가 최소한 Pro 버전 이상의 비주얼 스튜디어에서만 Optimizing Compiler 가 포함되어 있는 것으로 안다. SDK 등에 들어 있는 C컴파일러는 최적화(Optimizing)가 되지 않는 허술한 컴파일러일 것이다.


그런데 MS에서 Microsoft C/C++ Optimizing Compiler 를 몇 년 전(2004년쯤에)에 무료로 공개했다. 볼랜드(Borland)가 컴파일러(C++Builder Compiler) 일부를 공개하고 있는 것에 자극받아서인지도 모르겠다. 볼랜드의 것이든 MS의 것이든, 통합환경(IDE)은 없고 코맨드 라인 버전뿐이다. 볼랜드의 C컴파일러가 초보자에게는 조금 더 친절하지만, 이것으로 전문적인 프로그램이나 상용 프로그램을 개발하는 것은 좀 무리가 있었다.



Microsoft C/C++ Optimizing Compiler는, 정품 "Visual Studio .NET 2003 Professional"에 있는 코맨드 라인 컴파일러와 똑같은 것이다. 이것으로 상용 프로그램을 개발해도 된다("... even commercial applications."). 물론 "Visual Studio .NET 2003" DVD를 이미 가지고 있는 사람이라면, 이 Toolkit 을 다운로드받을 필요가 없다.


Microsoft Visual C++ Toolkit 2003 ( msdn.microsoft.com/visualc/vctoolkit2003/ # 2024-03-25: 현재 폐쇄) 여기서 무료로 다운로드받을 수 있다. 용량은 31.4 MB다. 설치 파일 이름은 VCToolkitSetup.exe 다.






컴파일러 설치법



파일을 실행하면 자동으로 설치되고 어려운 점은 없다.


cl.exe 라는 파일이, 컴파일러의 본체다.

명령 프롬프트에서 cl 이라면 치면 된다.

컴파일러 셋업 파일이 설치 때, cl.exe 를 위한 명령 프롬프트를 하나 만들어 준다. 시작메뉴에 보면 등록되어 있다. 초보자는 이 "전용 명령 프롬프트"에서 실행시키는 것이 무난하다.




도움말 옵션인 /? 를 붙여 실행하면 다음과 같은 화면이 나온다:
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함

D:\Z>cl.exe /?
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

                         C/C++ COMPILER OPTIONS

                             -OPTIMIZATION-

/O1 minimize space                       /Op[-] improve floating-pt consistency
/O2 maximize speed                       /Os favor code space
/Oa assume no aliasing                   /Ot favor code speed
/Ob<n> inline expansion (default n=0)    /Ow assume cross-function aliasing
/Od disable optimizations (default)      /Ox maximum opts. (/Ogityb2 /Gs)
/Og enable global optimization           /Oy[-] enable frame pointer omission
/Oi enable intrinsic functions

                            -CODE GENERATION-

/G3 optimize for 80386                   /Gh enable _penter function call
/G4 optimize for 80486                   /GH enable _pexit function call
/G5 optimize for Pentium                 /GR[-] enable C++ RTTI
/G6 optimize for PPro, P-II, P-III       /GX[-] enable C++ EH (same as /EHsc)
/G7 optimize for Pentium 4 or Athlon     /EHs enable C++ EH (no SEH exceptions)
/GB optimize for blended model (default) /EHa enable C++ EH (w/ SEH exceptions)
/Gd __cdecl calling convention           /EHc extern "C" defaults to nothrow
/Gr __fastcall calling convention        /GT generate fiber-safe TLS accesses
/Gz __stdcall calling convention         /Gm[-] enable minimal rebuild
/GA optimize for Windows Application     /GL[-] enable link-time code generation

/Gf enable string pooling                /QIfdiv[-] enable Pentium FDIV fix
/GF enable read-only string pooling      /QI0f[-] enable Pentium 0x0f fix
/Gy separate functions for linker        /QIfist[-] use FIST instead of ftol()
/GZ Enable stack checks (/RTCs)          /RTC1 Enable fast checks (/RTCsu)
/Ge force stack checking for all funcs   /RTCc Convert to smaller type checks
/Gs[num] control stack checking calls    /RTCs Stack Frame runtime checking
/GS enable security checks               /RTCu Uninitialized local usage checks
/clr[:noAssembly] compile for the common language runtime
   noAssembly - do not produce an assembly
/arch:<SSE|SSE2> minimum CPU architecture requirements, one of:
   SSE - enable use of instructions available with SSE enabled CPUs
   SSE2 - enable use of instructions available with SSE2 enabled CPUs

                             -OUTPUT FILES-

/Fa[file] name assembly listing file     /Fo<file> name object file
/FA[sc] configure assembly listing       /Fp<file> name precompiled header file
/Fd[file] name .PDB file                 /Fr[file] name source browser file
/Fe<file> name executable file           /FR[file] name extended .SBR file
/Fm[file] name map file

(press <return> to continue)
                             -PREPROCESSOR-

/AI<dir> add to assembly search path     /Fx merge injected code to file
/FU<file> forced using assembly/module   /FI<file> name forced include file
/C don't strip comments                  /U<name> remove predefined macro
/D<name>{=|#}<text> define macro         /u remove all predefined macros
/E preprocess to stdout                  /I<dir> add to include search path
/EP preprocess to stdout, no #line       /X ignore "standard places"
/P preprocess to file

                               -LANGUAGE-

/Zi enable debugging information         /Ze enable extensions (default)
/ZI enable Edit and Continue debug info  /Zl omit default library name in .OBJ
/Z7 enable old-style debug info          /Zg generate function prototypes
/Zd line number debugging info only      /Zs syntax check only
/Zp[n] pack structs on n-byte boundary   /vd{0|1} disable/enable vtordisp
/Za disable extensions (implies /Op)     /vm<x> type of pointers to members
/Zc:arg1[,arg2] C++ language conformance, where arguments can be:
   forScope - enforce Standard C++ for scoping rules
   wchar_t - wchar_t is the native type, not a typedef

                             -MISCELLANEOUS-

@<file> options response file            /wo<n> issue warning n once
/?, /help print this help message        /w<l><n> set warning level 1-4 for n
/c compile only, no link                 /W<n> set warning level (default n=1)
/H<num> max external name length         /Wall enable all warnings
/J default char type is unsigned         /Wp64 enable 64 bit porting warnings
/nologo suppress copyright message       /WX treat warnings as errors
/showIncludes show include file names    /WL enable one line diagnostics
/Tc<source file> compile file as .c      /Yc[file] create .PCH file
/Tp<source file> compile file as .cpp    /Yd put debug info in every .OBJ
/TC compile all files as .c              /Yl[sym] inject .PCH ref for debug lib
/TP compile all files as .cpp            /Yu[file] use .PCH file
/V<string> set version string            /YX[file] automatic .PCH
/w disable all warnings                  /Y- disable all PCH options
/wd<n> disable warning n                 /Zm<n> max memory alloc (% of default)
/we<n> treat warning n as an error

                                -LINKING-

/MD link with MSVCRT.LIB                 /MDd link with MSVCRTD.LIB debug lib
/ML link with LIBC.LIB                   /MLd link with LIBCD.LIB debug lib
/MT link with LIBCMT.LIB                 /MTd link with LIBCMTD.LIB debug lib
(press <return> to continue)
/LD Create .DLL                          /F<num> set stack size
/LDd Create .DLL debug library           /link [linker options and libraries]

D:\Z>


물론 이 많은 옵션들을 모두 이해하지 않아도 기본적인 사용은 가능하다. 그러나 C/C++이라는 것은 상당히 난해한 언어이고, 펄(Perl)과는 달리, 많은 공부가 필요한 '심각한 언어'이다. 전문 프로그래머가 되기 위해서는 이 옵션들을 이해해야 한다.

자세한 도움말은 MSDN 에 있다. 비주얼 스튜디오 DVD안에 MSDN 이 있고 설치하면 되는데, 이 글을 읽고 있는 분들은 비주얼 스튜디오가 없을 것이다. 그렇다면 Visual C++ Developer Center : Product Documentation ( msdn.microsoft.com/visualc/using/documentation/" # 2024-03-25: 현재 폐쇄) 여기서 온라인으로 읽으면 된다.





컴파일러를 설치했으면, 잘 설치되었는지 테스트하기 위해 간단한 프로그램을 만들어 컴파일해 본다. 이것을 흔히 Hello World! 프로그램이라고 한다. 여기서는 이것을 약간 한국화(?)시켰다.

#include <stdio.h>

int main(void) {

 printf("안녕하세요? ㅎㅎ");

 return 0;
}


위의 코드를 0.c 등의 적당한 이름으로 하드에 저장하자. (test.c 라는 이름으로 테스트 파일을 만드는 것은 좋지 않다. 유닉스/리눅스에는 test라는 명령어가 이미 있기 때문이다. 요즘에는 Win32에도 유닉스 툴을 설치하는 경우가 많기 때문에 충돌할 수 있다. 그래서 여기서는 숫자 제로를 사용해서 0.c 라는 이름으로 파일을 만들었다.)



명령 프롬프트에서 다음과 같이 실행시키면:

D:\Z>cl 0.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

0.c
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:0.exe
0.obj

D:\Z>0
안녕하세요? ㅎㅎ
D:\Z>


0.exe 라는 간단한 실행파일이 만들어지며, 0 를 쳐서 0.exe를 실행시키면 "안녕하세요? ㅎㅎ"라는 결과가 정확히 나온다.


좀더 복잡한 프로그램을 컴파일하면 에러가 날 수 있다. 이때는 /EHsc 옵션을 붙여서 실행해 본다.
헤더 파일과 라이브러리 파일의 위치도 환경 변수에 지정되어 있어야 한다. "전용 명령 프롬프트"를 사용한다면 이미 지정되어 있을 것이다.


이것은 필자가 사용하고 있는, C컴파일러 관련 환경변수 3개를 set 명령으로 출력한 것이다.
D:\Z>set
...중략...
CL=/O2 /G6 /EHsc /W4 /Wp64
Include=D:\Program Files\Microsoft Visual C++ Toolkit\include;D:\Program Files\Microsoft Platform SDK\Include;D:\WINDOWS_\Path\Project
Lib=D:\Program Files\Microsoft Visual C++ Toolkit\lib;D:\Program Files\Microsoft Platform SDK\Lib
...중략...
D:\Z>





Platform SDK 설치



지금까지 말한 툴킷(Microsoft Visual C++ Toolkit 2003)으로는, 다양한 프로그램들을 만들 수가 없다. 툴킷에는 Windows.h 조차도 들어 있지 않기 때문이다. 그러나 Platform SDK 를 무료로 다운로드받아서 추가해 주면 필요한 파일들의 상당수를 얻을 수 있다.

현재 Windows® Server 2003 SP1 Platform SDK ( https://www.microsoft.com/en-us/download ) 여기에서 Platform SDK를 받으면 될 것이다. Platform SDK 는 400메가에 가까운 용량이지만, 이 중에서 극히 일부의 파일만 필요하다. Platform SDK의 Include 와 Lib 폴더에 있는 파일만 가져오면 된다. (물론 Platform SDK 에는 여러가지 유용한 유틸리티(WinDiff.Exe 나 nmake.exe 등등)들이 많이 섞여 있으므로, 이삭줍기 하듯 골라서 가지면 쓸모가 많다.)

※ Platform SDK 를 설치하면 혹시 시스템이 지저분해질까 싶어서, 필자의 경우 Platform SDK를 VMware 속에다 설치한 후, 필요한 파일만 가져왔다.

아무튼 Platform SDK 를 설치하면 (D드라이브에 설치했을 경우) 다음과 같은 폴더가 만들어 지는데
       D:\Program Files\Microsoft Platform SDK\Include
       D:\Program Files\Microsoft Platform SDK\Lib
이것 역시 환경 변수에 추가해 주어야 한다. 그렇지 않으면 컴파일러(cl.exe)가 Platform SDK의 Include 와 Lib 폴더들을 찾지 못한다.

물론 이렇게 해도 MFC 프로그램은 개발이 안되는 것으로 알고 있다.






필자는 주로 펄을 쓰지만, 펄의 모듈들 중에서도, 속도가 필요한 경우에는, C로 모듈을 만들어야 한다. CPAN에 있는 많은 펄 모듈들 중, 적지 않은 모듈들이 C로 만들어져 있어 컴파일해 주어야 하는데, 따라서 펄 사용자라도 지금 말한 툴킷을 받을 필요가 있다. (C로 된 펄 모듈들은 .xs라는 확장자를 가지고 있다. .xs 파일을 Win32 환경에서 컴파일하는 것은, 컴파일러만 있다고 되는 것은 아니고 전문 지식이 필요한 좀 난해한 작업이다. 펄 모듈들의 상당수가 유닉스용으로 만들어져 있기 때문이다.)

다시 말하자면, 펄 사용자라도 C컴파일러 하나쯤은 있어야 한다는 이야기다. 영어가 세계 공용어라면, 프로그래밍의 세계에서의 공용어는 "C언어" 혹은 C++다. 반면 펄은 민족 언어에 해당할 것이다. 소수민족어는 아니고, 중국어처럼 사용자가 대단히 많은 민족어다.



펄(Perl)은, 텍스트('abcd' '가나다라' 등)를 다룰 때에는 C와 같은 빠른 속도를 보이지만 (왜냐하면 펄의 텍스트 조작 모듈이 C로 되어 있기에), 이진 파일을 다룰 때에는 견디기 힘들 정도로 느리다.

순수한 펄 코드만으로, 1GB 크기의 파일을 만들고 그 파일의 내용을 랜덤한 바이트들로 채우는 프로그램을 전에 만든 적이 있는데, 실행 완료에 무려 40분이나 걸렸다.

그런데 이 프로그램을, 위에서 말한 비주얼C로 다시 만들었더니 불과 40초 정도밖에 걸리지 않았다. 아니, 40초가 아니라 4초였는지도 모르겠다. 아무튼 믿기지 않을 정도로 빨랐다. 펄(스크립트 언어)이 아닌 C언어(컴파일러 언어)여서 빠르기도 했겠지만, 비주얼C가 Win32 환경에 최적화되어 있기 때문이기도 할 것이다.


※ 펄은, 순수한 스크립트 언어는 아니고 내부적으로는 컴파일을 한다. 그래서 스크립트 언어치고는 상당히 빠르다. ([Perl/펄] 윈도용 ActivePerl 설치법 참조)



관련 게시물:
[C언어] 비주얼C/C++ 컴파일러(cl.exe)용, 환경 변수(Environment Variables) 설정




tag: cpp
C언어 | C/C++ (Visual C++)

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top