2010년/연습문제

c 프로그램

뽀얀햄스터 2010. 3. 3. 17:39


 

C프로그램의 컴파일

X.c  =전처리=> X.i  =C컴파일=> X.asm =컴파일=>  X.obj  =링킹=> X.exe


1. 전처리 문장 만들기...
명령어> CL /P main.c

main.i 라는 파일 만들어진다~

2. 전처리문장보이기
전처리 문장은 프로그램이 컴파일 되는동안 사용후 삭제한다
그러나 그것을 보기 위해서 CL명령어중

명령어> CL /E main.c

통해서 명령프롬프트창에 전처리한다..


3. main.asm 즉 C컴파일로 통해 만든다.
전처리문 예제에서 #include<stdio.h>를 전처리후 지정한다.

명령어> CL /Fa main.c


4. 명령어> CL /c main.c 인해 컴파일하면 main.obj를 생성하게 된다.
즉 main.c 를 링크만하지않고  컴파일만 한다. 


5. 명령어> Link main.obj
컴파일되어 생성된 파일을 링킹을 해서 즉 실행할수있는 main.exe를 생성하게 된다.

6. main.c 를 main.i main.asm main.obj main.exe 4개의 파일을 모두 만들려면

명령어 > CL /P main.c | CL /Fa main.c 를 통해 모두 볼수 있다.


상세정보
1.전처리

전처리명령이란 #이붙어있는것을 전처리 명령이라고 한다.

일반적으로 소스코딩후에 컴파일과 링크과정을 거치는데

컴파일은 세부적으로 전처리과 컴파일과정으로 나누어진다.

전처리는 전처리기에 이루어지며, 컴파일은 컴파일러에 이루어진다.

예로 들면  #include <stdio.h>라고 되어있는것은,

stdio.h를 그위치에 그대로 복사한다는 뜻이다.

2. 컴파일

특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 것 을 말한다.

원래의 문서를 소스 코드 혹은 원시 코드라고 부르고 출력된 문서를 목적 코드라고 부른다.

목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만

사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다.

원시 코드에서 목적 코드로 옮기는 과정을 컴파일이라고 한다.

3. 링킹

소스코드를 작성하고,  컴파일을 하게되면

각각의 기능에 따라서 목적코드라고 하는 것을 담고있는 목적파일이 생성된다.

이러한 목적파일들을 실행가능한 형태로 만들기 위해, 

여러개의 목적파일들 하나로 연결해주는 작업이 필요한데, 이것을 링크, 또는 링킹 이라고 한다.

예를 들면 컴파일로 완성된 OBJ파일을  우리가 사용할수있는 EXE 파일 즉 실행파일을 생성시켜주는 것이다.


CL 명령어 옵션 관련 사이트
http://msdn.microsoft.com/ko-kr/library/fwkeyyhe.aspx
http://blog.naver.com/picbuddy?Redirect=Log&logNo=80045597013


C:\>cl /?

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++ 컴파일러 옵션

 

                              -최적화-

 

/O1 공간을 최소화합니다.                       /Op[-] 부동 소수점 일치를 향상시킵니다.

/O2 속도를 최대화합니다.                       /Os 코드 공간을 우선합니다.

/Oa 별칭 없음으로 가정합니다.                   /Ot 코드 속도를 우선합니다.

/Ob<n> 인라인 확장합니다(기본값 n=0).    /Ow 크로스 함수 별칭으로 가정합니다.

/Od 최적화를 사용하지 않습니다(기본값).      /Ox 최대 옵션을 사용합니다(/Ogityb2 /Gs).

/Og 전역 최적화를 사용합니다.           /Oy[-] 프레임 포인터를 생략합니다.

/Oi 내장 함수를 사용합니다.

 

                             -코드 생성-

 

/G3 80386에 맞게 최적화합니다.                   /Gh _penter 함수 호출을 사용합니다.

/G4 80486에 맞게 최적화합니다.                   /GH _pexit 함수 호출을 사용합니다.

/G5 Pentium에 맞게 최적화합니다.                 /GR[-] C++ RTTI를 사용합니다.

/G6 PPro, P-II, P-III에 맞게 최적화합니다.       /GX[-] C++ EH를 사용합니다(/EHsc와 같음).

/G7 Pentium 4 또는 Athlon에 맞게 최적화합니다.     /EHs C++ EH를 사용합니다(SEH 예외 없음).

/GB 복합 모델에 맞게 최적화합니다(기본값). /EHa C++ EH를 사용합니다(SEH 예외 있음).

/Gd __cdecl 호출 규칙           /EHc extern "C" 기본값을 nothrow로 설정합니다.

/Gr __fastcall 호출 규칙        /GT 파이버 안전 TLS 액세스를 생성합니다.

/Gz __stdcall 호출 규칙         /Gm[-] 최소 다시 빌드를 사용합니다.

/GA Windows 응용 프로그램에 맞게 최적화합니다.      /GL[-] 링크 시간 코드 생성을 사용합니다.

/Gf 문자열 풀링을 사용합니다.                /QIfdiv[-] Pentium FDIV 수정을 사용합니다.

/GF 읽기 전용 문자열 풀링을 사용합니다.      /QI0f[-] Pentium 0x0f 수정을 사용합니다.

/Gy 링커 분리 함수를 사용합니다.        /QIfist[-]  ftol() 대신 FIST를 사용합니다.

/GZ 스택 검사를 사용합니다(/RTCs).          /RTC1 빠른 검사를 사용합니다(/RTCsu).

/Ge 모든 함수에 대한 스택 검사를 수행합니다.   /RTCc 작은 형식 검사로 변환합니다.

/Gs[num] 스택 검사 호출을 제어합니다.    /RTCs 스택 프레임 런타임 검사를 사용합니다.

/GS 보안 검사를 사용합니다.               /RTCu 초기화되지 않은 지역 사용 검사를 사용합니다.

/clr[:noAssembly] 공용 언어 런타임에 대해 컴파일합니다.

    noAssembly - 어셈블리를 생성하지 않습니다.

/arch:<SSE|SSE2> 최소 CPU 아키텍처 요구 사항(다음 중 하나):

    SSE - SSE를 사용할 수 있는 CPU의 명령을 사용합니다.

    SSE2 - SSE2를 사용할 수 있는 CPU의 명령을 사용합니다.

 

                              -출력 파일-

 

/Fa[file] 어셈블리 목록 파일의 이름을 지정합니다.     /Fo<file> 개체 파일의 이름을 지정합니다.

/FA[sc] 어셈블리 목록을 구성합니다.       /Fp<file> 미리 컴파일된 헤더 파일의 이름을 지정합니다.

/Fd[file] .PDB 파일의 이름을 지정합니다.                 /Fr[file] 소스 브라우저 파일의 이름을 지정

합니다.

/Fe<file> 실행 파일의 이름을 지정합니다.           /FR[file] 확장 .SBR 파일의 이름을 지정합니다.

/Fm[file] 맵 파일의 이름을 지정합니다.

 

                              -전처리기-

 

/AI<dir> 어셈블리 검색 경로에 추가합니다.     /Fx 삽입된 코드를 파일에 병합합니다.

/FU<file> 강제로 어셈블리/모듈을 사용합니다.   /FI<file> 강제 포함 파일의 이름을 지정합니다.

/C 주석을 제거하지 않습니다.                  /U<name> 미리 정의된 매크로를 제거합니다.

(계속하려면 <return> 키를 누르십시오.)

/D<name>{=|#}<text> 매크로를 정의합니다.         /u 미리 정의된 모든 매크로를 제거합니다.

/E stdout로 전처리합니다.                  /I<dir> 포함 검색 경로에 추가합니다.

/EP #line 없이 stdout로 전처리합니다.       /X "표준 위치"를 무시합니다.

/P 파일로 전처리합니다.

 

                                -언어-

 

/Zi 디버깅 정보를 사용합니다.         /Ze 확장명을 사용합니다(기본값).

/ZI 디버그 정보의 편집하며 계속하기를 사용합니다.  /Zl .OBJ에 있는 기본 라이브러리 이름을 생략합니다

.

/Z7 이전 스타일의 디버그 정보를 사용합니다.          /Zg 함수 프로토타입을 생성합니다.

/Zd 줄 번호 디버깅 정보만 확인합니다.     /Zs 구문만 확인합니다.

/Zp[n] n-바이트 경계에서 구조체를 압축합니다.   /vd{0|1} vtordisp를 설정/해제합니다.

/Za 확장명을 사용하지 않습니다(/Op를 의미).     /vm<x> 멤버에 대한 포인터 형식을 사용합니다.

/Zc:arg1[,arg2] C++ 언어 규칙이며 인수는 다음과 같습니다.

    forScope - 범위 지정 규칙에 표준 C++를 적용합니다.

    wchar_t - wchar_t는 형식 정의가 아니라 네이티브 형식입니다.

 

                              -기타-

 

@<file> 지시 파일을 지정합니다.            /wo<n> 한 번에 n개의 경고를 보냅니다.

/?, /help 이 도움말 메시지를 인쇄합니다.        /w<l><n> n에 경고 수준(1-4)을 설정합니다.

/c 링크하지 않고 컴파일만 수행합니다.                 /W<n> 경고 수준을 설정합니다(기본값 n=1).

/H<num> 최대 외부 이름 길이를 지정합니다.         /Wall 모든 경고를 사용합니다.

/J 기본 문자 형식은 부호 없음입니다.         /Wp64 64비트 포팅 경고를 사용합니다.

/nologo 저작권 메시지를 표시하지 않습니다.       /WX 경고를 오류로 처리합니다.

/showIncludes 포함 파일 이름을 표시합니다.    /WL 진단 정보를 한 줄로 표시합니다.

/Tc<source file> 파일을 .c로 컴파일합니다.      /Yc[file] .PCH 파일을 만듭니다.

/Tp<source file> 파일을 .cpp로 컴파일합니다.    /Yd 모든 .OBJ에 디버그 정보를 입력합니다.

/TC 모든 파일을 .c로 컴파일합니다.              /Yl[sym] 디버그 라이브러리에 .PCH 참조를 넣습니다.

/TP 모든 파일을 .cpp로 컴파일합니다.            /Yu[file] .PCH 파일을 사용합니다.

/V<string> 버전 문자열을 설정합니다.            /YX[file] 자동 .PCH입니다.

/w 모든 경고를 사용하지 않습니다.                  /Y- 모든 PCH 옵션을 사용하지 않습니다.

/wd<n> n개의 경고를 사용하지 않습니다.                 /Zm<n> 최대 메모리를 할당합니다(기본값의 %).

/we<n> n개의 경고를 하나의 오류로 처리합니다.

 

                                 -링크-

 

/MD MSVCRT.LIB에 링크합니다.                 /MDd MSVCRTD.LIB 디버그 라이브러리에 링크합니다.

/ML LIBC.LIB에 링크합니다.                   /MLd LIBCD.LIB 디버그 라이브러리에 링크합니다.

/MT LIBCMT.LIB에 링크합니다.                 /MTd LIBCMTD.LIB 디버그 라이브러리에 링크합니다.

/LD .DLL을 만듭니다.                          /F<num> 스택 크기를 설정합니다.

/LDd .DLL 디버그 라이브러리를 만듭니다.           /link [링커 옵션 및 라이브러리]