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파일을
넣어주고 아래와 같이 비주얼 스튜디오를 설정만 해주면 된다.