GPC 컴파일 교훈

과거(2008) 컴파일한 것은 32비트용이었다.

최근(2019) 컴파일해야 하는 것은 64비트용이다.

기존의 프로젝트 파일을 수정하기보다 새로 프로젝트 파일을 만들어서 했다.

Debug 모드가 아니라 Release 모드로 컴파일해야 다른 컴퓨터에서 사용할 수 있다.

c/c++ 소스를 컴파일하는 것이므로, visual c++ redistributable(재배포 패키지)를 설치해야 한다.

컴파일한 DLL이 의존하는 다른 DLL이 없어도 오류가 발생한다. 의존관계를 알 수 있는 프로그램(dependencies)도 있다.

extern “C” error #2040: expected an identifier

gpc.c를 컴파일하다가 발생한 에러

[해법]

The extern "C" construct is a C++ specific thing, it can’t be used in C. And the compiler treats your source file as a C source file since it has the extension .c.

[참고문헌]

https://stackoverflow.com/questions/16192872/extern-c-error-2040-expected-an-identifier

https://shoon950.tistory.com/entry/함수-오버로딩-extern-C-cplusplus-매크로

https://dojang.io/mod/page/view.php?id=802

[교훈]

확장자 .c와 .cpp의 차이를 기억하자.

System.DllNotFoundException 에러 처리

[문제]

gpc64.dll을 이용한 프로그램을 다른 컴퓨터에서 실행했더니, 제목과 같은 에러 메시지가 발생했다.

실행시켰을 때의 에러 메시지
디버깅했을 때의 에러 메시지

[환경]

Windows 10 x64, Visual Studio 2019

[System.DllNotFoundExceoption 에러 원인]

원인1. 문제의 에러 메시지는 gpc64.dll 파일이 없기 때문에 표시된다.

-> 그런데 해당 폴더에 dll 파일이 존재할 때도 에러가 발생할 수 있다.

원인2. 이 때, 해당 dll(여기서는 gpc64.dll)이 의존하고 있는 dll이 없어도 똑같은 에러가 발생한다.

-> 해당 dll에 의존하는 모든 dll이 설치되지 않았기 때문에 이런 에러가 발생한다.

[해법]

depends.exe(Dependency Walker)를 이용해서 누락된 DLL을 확인할 줄 알았는데, 이를 계승한 새 프로그램(Download here)으로 확인하였다.

확인한 결과, 나의 경우 C++재배포가능패키지가 없었다. 그래서 다음 링크에서 재배포가능패키지를 설치한다.

Install Microsoft Visual C++ 2019 Redistributable Package on the user’s machine

https://support.microsoft.com/ko-kr/help/2977003/the-latest-supported-visual-c-downloads

[교훈]

DLL을 사용할 때, 의존성 여부도 확인해야 한다.

[참고 사이트]

https://www.sysnet.pe.kr/2/0/713

https://stackoverflow.com/questions/14587775/system-dllnotfoundexception-unable-to-load-dll-no-errors-in-dev-machine-but-er

GPC64.DLL 만들기

개발 환경

다각형 연산 도구 General Polygon Clipper : version 2.32, 2014

컴파일에 사용한 wrapper는 VB.NET wrapperTadej Basa

컴파일러 : Visual Studio 2019

Visual Studio Project 속성 설정하기

fscanf와 같은 함수는 보안에 문제가 있다는 경고를 띄운다. 이를 없애기 위해서 _CRT_SECURE_NO_WARNINGS를 ‘전처리기’에 추가하였다. 자세한 설명은 아래에 있다.

gpc.c가 그냥 C언어로 되어 있기에 “미리 컴파일된 헤더”를 사용하지 않았다. 그래서 아래와 같이 설정하였다. “pch.h”를 삭제한다.


Preprocessor – GPC64_EXPORTS

gpc.h에 #define을 정리하다

전처리기(preprocessor)에 “GPC64_EXPORTS”를 안 하면, error c2491 가 발생한다. 주의해야 한다.

Preprocessor : _CRT_SECURE_NO_WARNINGS

fscanf 와 같은 함수들이 보안 관련 경고를 발생시킨다. 이를 방지하고자 이 옵션을 걸었다.

참고 : Remove secure warnings

미리 컴파일된 헤더 Precompiled Header

이전에 개발된 gpc(gpc.c, gpc.h)가 현재 개발 환경에 맞지 않아서, 미리 컴파일된 헤더는 사용하지 않았다. 사용하면 에러가 많이 뜬다.

컴파일하는 과정에서 생겼던 오류와 검색 내용들

DLL 만들기 32비트/64비트

기존의 vbwrapper.sln을 이용했더니, 아무리 설정을 바꾸어도 에러가 발생하였다. 새로 DLL 프로젝트를 만든 다음, gpc.h와 gpc.c를 추가하고 위와 같이 컴파일 옵션을 설정하니, 제대로 만들어졌다.

프로젝트 설정 화면(pdf)


교훈

때로는 새로 시작하는 것이 나을 때가 있다. 오래된 비주얼 스튜디오 파일을 쓰기보다 새로 만들어서 쓰자.

DLL 만들기 32비트/64비트

https://m.blog.naver.com/PostView.nhn?blogId=sogangori&logNo=220587896152&proxyReferer=https%3A%2F%2Fwww.google.com%2F

자체 동적 연결 라이브러리 만들기 및 사용(C++)

64비트 컴퓨터에 설치된 Visual Studio 2015로 32비트용 실행파일 컴파일하기

https://stackoverflow.com/questions/50164687/how-to-compile-a-64-bit-dll-written-in-c

fscanf error

https://bymakers.tistory.com/6

Code Library 기능을 하는 DLL 만들기

Visual Basic 6.0에서 DLL만들기를 하려면, 다음과 같은 절차대로 실행한다.

1. VB에서 새 ActiveX DLL 프로젝트를 만든다

2. 프로젝트에서 클래스 모듈을 새로 만든다

3. 클래스 모듈의 Instancing 속성을 GlobalMultiUse로 설정한다. 그러면, 그 프로시저를 원하는 모든 프로젝트에 프로시저가 표시되며, 전역 프로시저처럼 실행된다.

4. 코드에서 필요한 모든 개체 라이브러리에 대해 참조를 설정한다.

5. 코드 라이브러리의 프로시저를 클래스 모듈에 Public Function 프로시저와 Sub 프로시저로 추가한다.

6. “프로젝트”메뉴의 속성을 클릭하고 Project Name속성에 대해 새 값을 입력하여 “프로젝트 이름”을 원하는 코드 라이브러리 이름으로 바꾼다.

7. DLL을 만든다. (compile)

 

DLL 사용하기

DLL에 참조를 설정하려면 “도구”메뉴의 “참조”를 클리하고 “찾아보기” 단추를 이용하여 DLL을 찾는다. 또는 declare문을 사용하여 DLL의 개별 프로시저에 대해 참조를 설정할 수도 있다.