Programming/Tips

c++ import 문과 /MP 스위치

acidpop 2012. 10. 16. 16:33
반응형

 Visual Studio 2010 을 사용중 /MP 스위치를 사용 할 수 있다는것을 깜박하고 있다가 진행 중인 프로젝트에 적용을 시켜 보았다.

 

프로젝트 옵션 -> C/C++ -> 일반 -> 다중 프로세서 컴파일에 예(/MP ) 옵션을 켜고 컴파일 시작.

 

Gm 스위치와 호환이 안되므로 MP 를 무시한다고 나옴..

 

프로젝트 옵션 -> C/C++ -> 코드 생성 -> 최소 다시 빌드 가능 항목의 /Gm 옵션을 아니오 (/Gm-) 로 바꿔준 다음

 

다시 컴파일을 진행...

 

error C2813: /MP를 지정하면 #import를 사용할 수 없습니다.

 

으엌.. ㅠㅠ

 

프로젝트에서 사용중인 ADO dll 을 import 해서 사용중인데 MP 스위치와 import 옵션을 동시에 사용 할 수 없다고 MSDN 에서도 명확하게 말하고 있음..

 

그래도 난 쓰고 싶은데.. 그래서 찾아 봄.

 

#import 구문을 통해 사용하는 dll 은 COM 으로 이루어진 dll 이기 때문에 tlh 같은 Type Library Header 가 분명 생성이 됨

 

다음과 같은 과정을 거치면 import 구문을 빼고 include 구문으로 변경해서 MP 스위치를 사용 할 수 있다.

 

1. tlh 파일 추출하기

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF""adoEOF") rename("BOF""adoBOF")

 

구문을 그대로 두고 컴파일을 진행 한다.

 

컴파일이 성공하면 Object 파일들이 생성 되는 Debug 폴더 또는 Release 폴더로 가보자.

 

#import 처리기가 하는 역할이 dll 에서 tlh 를 추출하여 헤더 파일에 그대로 붙여 넣는 작업을 해주는 역할이기 때문에 Debug 폴더나 Release 폴더에 가보면 다음과 같은 파일이 보일것이다.

 

msado15.tlh

msado15.tli

 

각각 용량은 167KB, 146KB 정도로 꽤 큰편이다.

 

위 두파일을 복사해서 #import 구문을 사용했던 소스와 동일한 경로에 붙여넣기 한다.

 

#import ".........

코드를 다음과 같이 변경한다.

#include "msado15.tlh"

 

이렇게 하면 #import 로 추출된 tlh 파일을 include 하는 구조이기 때문에 동일한 역할을 수행한다.

 

/MP 스위치를 켜고 빌드 -> 솔루션 다시 빌드 를 선택하여 컴파일을 진행해 보면 또 컴파일 실패가 된다.

 

msado15.tlh(5025): fatal error C1083: 포함 파일을 열 수 없습니다. "....\msado15.tli': No such file or directory"

 

하지만 컴파일 오류 내용을 잘 보면 포함 파일을 열 수 없습니다. 라고 나오는것을 알 수 있기 때문에 tlh 파일 안에서 msado15.tli 파일을 찾을 수 없다 라는 오류를 알 수 있다.

 

msado15.tlh 파일을 메모장등의 에디터로 열어보자.

 

편집 -> 찾기 메뉴를 이용하요 .tli 를 찾아 보면 거의 끝부분에서 다음 줄을 찾을 수 있다.

 

//
// Wrapper method implementations
//

#include ".......\debug\msado15.tli"

 

 

앞 경로는 개인정보 보호상 삭제..

 

Full Path 로 된 #include  문을 찾을 수 있는데 바로 이 부분의 경로가 Debug 폴더까지 들어가 있어서 파일을 찾을 수 없는것으로 나오는것이다.

 

경로를 #import 문이 있는 소스의 경로로 수정한 다음 다시 한번 컴파일 해보면

 

제대로 컴파일 되는것을 확인 할 수 있다.

 

진행중인 프로젝트의 소스는 약 9500 라인의 C++ 소스이며 /MP 적용을 하지 않고 컴파일 하면

 

1:21초 정도의 컴파일 진행시간이 소요 된다.

 

/MP 적용후에는 31초로 시간이 단축 되는것을 확인 할 수 있으며

 

즉, 다음과 같다.

 

 /MP 적용 전 -> 1분 21초

 /MP 적용 후 -> 31초            약 260% 컴파일 속도 증가

 

다음과 같이 CPU 도 Full 로 사용하는것을 볼 수 있다.

 

 

 

다들 /MP 옵션을 이용해서 컴파일 시간을 줄여 보아요~~!

 

 

 

반응형