Monday, October 09, 2006
C언어] cl.exe: 소스 파일 여러개 한꺼번에 컴파일하는 배치파일: Multiple Source Files Compile at Once
여러 개의 .cpp 소스 파일을 한꺼번에 컴파일하는 강력한(?) 배치 파일을 소개합니다.
수십 수백 개의 C소스를, 서로 독립적으로 한꺼번에 컴파일하려면 와일드카드로는 안되더군요 -_-? 그래서 다음과 같이 배치 파일 (Batch File)을 만들었습니다.
위의 박스의 배치파일 코드를 hanq.bat 등의 적당한 이름으로 저장하고, 실행시키면
이렇게 현재 디렉토리의 모든 C소스가 서로 독립적인 exe 파일로 컴파일됩니다. (참고로, 위의 화면은 CL에 /nologo 옵션을 주었기에, 화면이 간결하게 나왔습니다.)
만약 C소스 확장자가, .cpp 가 아닌 그냥 .c 라면
for %%i in (*.c) do cl.exe "%%i"
이렇게 고쳐 주어야 하겠지요. 그렇지만 컴파일 환경에 따라서, C++가 아닌 순수한 C라도 확장자가 .cpp 가 아니면 컴파일이 안되고 오작동하는 경우가 많습니다. 따라서 순수한 C소스라도 확장자를 .cpp 로 하는 것이 무난하더군요.
원래, 비주얼C++ 명령행 컴파일러인 cl.exe 에, *.cpp 등의 와일드카드를 주어 여러 소스 파일을 한꺼번에 컴파일하려고 하면 다음과 같은 에러가 납니다.
링커(Linker)가 모든 .obj 파일들을 합치려다가 에러가 나고 있습니다.
▶▶ C언어 팁] cl.exe: C소스 컴파일 + 컴파일된 프로그램 실행을 동시에 하는 법: Handy Compile
▶▶ 배치파일] FOR 문 예제. for in do 사용법 - 도스 DOS Bat File 강좌
수십 수백 개의 C소스를, 서로 독립적으로 한꺼번에 컴파일하려면 와일드카드로는 안되더군요 -_-? 그래서 다음과 같이 배치 파일 (Batch File)을 만들었습니다.
@echo off
for %%i in (*.cpp) do cl.exe "%%i"
for %%i in (*.cpp) do cl.exe "%%i"
위의 박스의 배치파일 코드를 hanq.bat 등의 적당한 이름으로 저장하고, 실행시키면
D:\Y>hanq.bat
0.cpp
10.cpp
dump_array.cpp
strdump_to_word.cpp
D:\Y>dir
D 드라이브의 볼륨: Foo
볼륨 일련 번호: F8A0:572A
D:\Y 디렉터리
2006-10-09 11:44a <DIR> .
2006-10-09 11:44a <DIR> ..
2006-10-08 05:33p 1,803 0.cpp
2006-10-09 11:44a 45,056 0.exe
2006-10-09 11:44a 3,196 0.obj
2006-10-08 04:18p 447 10.cpp
2006-10-09 11:44a 36,864 10.exe
2006-10-09 11:44a 931 10.obj
2006-09-28 03:36p 969 dump_array.cpp
2006-10-09 11:44a 40,960 dump_array.exe
2006-10-09 11:44a 3,766 dump_array.obj
2006-10-09 11:26a 59 hanq.bat
2006-09-29 04:15p 2,035 strdump_to_word.cpp
2006-10-09 11:44a 36,864 strdump_to_word.exe
2006-10-09 11:44a 2,351 strdump_to_word.obj
13개 파일 175,301 바이트
2 디렉터리 57,680,314,368 바이트 남음
D:\Y>
0.cpp
10.cpp
dump_array.cpp
strdump_to_word.cpp
D:\Y>dir
D 드라이브의 볼륨: Foo
볼륨 일련 번호: F8A0:572A
D:\Y 디렉터리
2006-10-09 11:44a <DIR> .
2006-10-09 11:44a <DIR> ..
2006-10-08 05:33p 1,803 0.cpp
2006-10-09 11:44a 45,056 0.exe
2006-10-09 11:44a 3,196 0.obj
2006-10-08 04:18p 447 10.cpp
2006-10-09 11:44a 36,864 10.exe
2006-10-09 11:44a 931 10.obj
2006-09-28 03:36p 969 dump_array.cpp
2006-10-09 11:44a 40,960 dump_array.exe
2006-10-09 11:44a 3,766 dump_array.obj
2006-10-09 11:26a 59 hanq.bat
2006-09-29 04:15p 2,035 strdump_to_word.cpp
2006-10-09 11:44a 36,864 strdump_to_word.exe
2006-10-09 11:44a 2,351 strdump_to_word.obj
13개 파일 175,301 바이트
2 디렉터리 57,680,314,368 바이트 남음
D:\Y>
이렇게 현재 디렉토리의 모든 C소스가 서로 독립적인 exe 파일로 컴파일됩니다. (참고로, 위의 화면은 CL에 /nologo 옵션을 주었기에, 화면이 간결하게 나왔습니다.)
만약 C소스 확장자가, .cpp 가 아닌 그냥 .c 라면
for %%i in (*.c) do cl.exe "%%i"
이렇게 고쳐 주어야 하겠지요. 그렇지만 컴파일 환경에 따라서, C++가 아닌 순수한 C라도 확장자가 .cpp 가 아니면 컴파일이 안되고 오작동하는 경우가 많습니다. 따라서 순수한 C소스라도 확장자를 .cpp 로 하는 것이 무난하더군요.
원래, 비주얼C++ 명령행 컴파일러인 cl.exe 에, *.cpp 등의 와일드카드를 주어 여러 소스 파일을 한꺼번에 컴파일하려고 하면 다음과 같은 에러가 납니다.
D:\Y>cl.exe *.cpp
0.cpp
10.cpp
dump_array.cpp
strdump_to_word.cpp
Generating Code...
10.obj : error LNK2005: _main already defined in 0.obj
dump_array.obj : error LNK2005: _main already defined in 0.obj
strdump_to_word.obj : error LNK2005: _main already defined in 0.obj
0.exe : fatal error LNK1169: one or more multiply defined symbols found
D:\Y>cl 0.cpp 10.cpp
0.cpp
10.cpp
Generating Code...
10.obj : error LNK2005: _main already defined in 0.obj
0.exe : fatal error LNK1169: one or more multiply defined symbols found
D:\Y>
0.cpp
10.cpp
dump_array.cpp
strdump_to_word.cpp
Generating Code...
10.obj : error LNK2005: _main already defined in 0.obj
dump_array.obj : error LNK2005: _main already defined in 0.obj
strdump_to_word.obj : error LNK2005: _main already defined in 0.obj
0.exe : fatal error LNK1169: one or more multiply defined symbols found
D:\Y>cl 0.cpp 10.cpp
0.cpp
10.cpp
Generating Code...
10.obj : error LNK2005: _main already defined in 0.obj
0.exe : fatal error LNK1169: one or more multiply defined symbols found
D:\Y>
링커(Linker)가 모든 .obj 파일들을 합치려다가 에러가 나고 있습니다.
▶▶ C언어 팁] cl.exe: C소스 컴파일 + 컴파일된 프로그램 실행을 동시에 하는 법: Handy Compile
▶▶ 배치파일] FOR 문 예제. for in do 사용법 - 도스 DOS Bat File 강좌
tag: cpp
C언어 | C/C++ (Visual C++)
tag: batch
배치파일 | DOS CMD BATCH .BAT
<< Home