2011. 5. 1. 22:19

아.. 어제 오늘 해서 C++ Builder 2010에서 OpenMP를 사용하기 위해 여러가지 방법을 찾고 해결하고 지지고 볶고 했는데.. 그러면서 DllMain()도 오랜만에 다시 보게 되고.. 교착에 대한 문제 때문에 정적라이브러리를 링킹해서 쓰는 방법을 택하게 되면서 병맛같은 포멧에 대해 알게 되버렸다. COFF와 OMF는 Import Library의 포멧이다. 사실 난 저런게 뭔지도 몰랐다.
뭐 여튼간에 Visual Studio에서는 COFF를 사용하고 C++ Builder 2010에서는 OMF를 사용한다. 난 Dll을 VS에서 만들었기 때문에 저 포멧을 변경을 해야 했다.. 거의 하루 왼죙일 저거만 붙잡고 있었는데 간단하게 정리를 해보겠다.

방법은 3가지이다.

1. implib 유틸리티를 사용하여 Dll로 부터 lib 파일을 추출한다.


아주 간단한 방법이다. 근데 이 방법의 문제는 Dll에 정의된 함수들의 호출규약에 따라 되느냐 마느냐가 결정 된다.
만약 호출규약이 __stdcall 이라면 정상적으로 실행이 되지만 만약 __cdecl이라면 위의 유틸리티는 무용지물이 되어버릴 것이다.

2. coff2omf 유틸리티를 사용하여 lib파일로 부터 lib파일을 추출한다.


이 방법 역시 유틸리티를 사용하는 방법이기 때문에 아주 쉽고 간단하다. 근데 이 유틸리티는 수 많은 C++ Builder 이용자들에게 신뢰받는 방법이 아니라고 보인다. 실제로 필자 역시 좋지 않은 결과물을 주었다.

3. Dll 파일로부터 impdef 유틸리티를 사용해서 def 파일을 추출하고, 추출된 def 파일로 implib 유틸리티를 사용하여 lib 파일을 추출한다.



위 사진에서 -a 옵션에 주의하자. 이는 함수 호출규약에 의해 발생되는 Name Decoration에 영향을 준다.
그 다음 위에서 봤던 implib 유틸리티를 이용한다.


필자는 저렇게 메시지가 나왔는데.. 의외로 이 상황에서 만들어진 정적라이브러리(.lib) 파일이 잘 되는것 같았다. 근데 사실 필자가 테스트하면서 하도 똑같은 이름의 파일을 많이 만들어서 위 과정을 거친 파일이 잘 된 파일인지 아닌지 잘 모르겠다. ㅡ,.ㅡ;

3번 방법 참고 : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=18342

필자는 dll파일을 직접 만들었기 때문에 함수들의 호출 규약을 __stdcall로 변환한 다음 1번 방법으로 생성된 정적라이브러리(.lib) 파일을 갖고 성공했다.. 이걸 갖고 하루 왼 죙일 시달렸는데 성공하고 나니까 진짜 "난 왜 이렇게 발전속도가 느릴까?" 라는 생각이 끊이질 않는다. ㅋㅋㅋㅋ 아 시발 나 어렸을 때 지니어스라고 시발 존나 불렸는데.. 아이큐도 시발 134 나와서 전교에서 2번째 높았는데.. 근데 시발 인생은 존나 시궁창 ㅋㅋ

마지막으로 필자가 오늘 한 개삽질을 공개한다.. 좀 쪽팔리지만.. 정적라이브러리(.lib) 파일만 갖고 함수를 호출할 수 없다는건 누구나 다 아는 사실일 것이다. 필자도 물론 잘 알고 있다. 동적라이브러리(.dll) 파일은 실행파일과 같이 있어야 하고 정적라이브러리(.lib) 파일은 소스파일과 같이 있어야 한다. 이 같은 사실 역시 필자는 잘 알고 있다. 하지만 간과하고 정적(.lib), 동적(.dll)파일을 모두 소스파일에 같이 위치 시켰다.
어떻게 됐겠는가? 실행파일이 생성되는 과정까지 아무런 문제가 없다. 문제는 프로그램을 실행해보면 아는데.. 뭐 볼것도 없다. 기냥 안된다. ㅡ,.ㅡ; 필자는 오늘 이 문제를 갖고 약 5시간 동안 싸웠다. ㅋㅋㅋ

여튼 시발 존나 ㅋㅋ 어제는 토요일 오늘은 일요일이면서 근로자의 날인데 사무실 나와서 좆빠지게 삽질하면서 얻은 결과이다. 소중하게 간직해야지.. ㅋㅋ



'프로그래밍' 카테고리의 다른 글

Calling Convention ( 호출 규약 ) __cdecl, __stdcall, __fastcall  (3) 2011.05.02
extern 이라는 키워드에 대한 고찰  (3) 2011.05.02
DllMain()  (1) 2011.05.01
C++ Builder에서 OpenMP 쓰기  (1) 2011.04.30
메모리 구조  (1) 2011.02.28
Posted by 뿌직