3 min read

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파일을

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