32비트와 64비트를 따로 제공하는 라이브러리를 통합시키기

제가 자주 쓰는 기법이긴한데 큰 도움이 될지 모르겠지만 한번 올려본다.

이 기법을 자주 쓰는 큰예로 mysql있는데

mysql Connector라이브러리을 보자면 32비트와 64비트가 따로 있다.

이 말은 프레임워크 제작시 32비트 64비트라이브러리를 지원하기위해

거의 99%동일한 소스파일을 프로젝트 풀더에 모든 버전의 라이브러리를 전부 넣어야

한다는 의미이다.

나는 아래와 같은 해결방법으로 이 문제를 해결한다.

 

문제되는 라이브러리에서 32비트와 64비트 차이점을 알기위해 모든 버전의 라이브러리를 받고, 그 후 다운받은 32bit 라이브러리와 64bit 라이브러리를 아래와 같은 diff명령어를 친다.

1
diff 32bit/include/ 64bit/include/
cs

그 결과 아래와 같이 다른부분을 출력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
diff 32bit/include/my_config.h 64bit/include/my_config.h
93c93
< /* #undef HAVE_GETNAMEINFO */
> #define HAVE_GETNAMEINFO 1
141c141
< /* #undef HAVE_INET_NTOP */
> #define HAVE_INET_NTOP 1
172,173c172,173
< #define SIZEOF_VOIDP     4
< #define SIZEOF_CHARP     4
> #define SIZEOF_VOIDP     8
> #define SIZEOF_CHARP     8
217c217
< #define MACHINE_TYPE “AMD64”
> #define MACHINE_TYPE “x86_64”
222c222
< #define SYSTEM_TYPE “Win32”
> #define SYSTEM_TYPE “Win64”
cs

diff를 보면 my_config.h 헤더파일만 차이가 있는걸 볼수 있다.

문제되는 헤더파일을 알았으니 이 헤더파일을 통합시켜주면 된다.

통합시킨 헤더파일에서 가장 중요한점은 64비트일때 64비트의 소스파일만 돌아가면 되고 32비트일때에는  32비트의 소스파일만 돌아가면된다.

이를 만족할려면 조건부 컴파일을 사용한다.

글솜씨가 부족해 대충 형태를 표현하면 아래와 같다.

1
2
3
4
5
6
7
8
#ifdef _WIN64
//64bit/include/my_config.h 파일의 내용을 담는다
#elif _WIN32
//32bit/include/my_config.h 파일의 내용을 담는다
#endif
cs

이로써 하나의 라이브러리만 참조하여 32비트 64비트 모두 만족하는 라이브러리가 된다.

딱 하나 문제가 있다면 lib파일인데 이는 어쩔수 없이 따로 지정해줘야 한다.

위와 같이 풀더를 만들고 32bit에는 32비트인 lib파일을 64bit에는 64비트인 lib파일을

넣어주고 아래와 같이 비주얼 스튜디오를 설정만 해주면 된다.

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다