[C] SQLite 라이브러리 빌드하기 : 윈도우 dll 또는 리눅스 so 로 빌드하자

C 언어를 사용하여 SQLite 라이브러리를 빌드하는 방법에 대한 가이드입니다. SQLite를 사용하여 강력한 데이터베이스를 구축하고 프로그램에 통합하세요.

윈도우즈에서 dll로 빌드하기

1. SQLite 공식 사이트로 가셔서 최신 소스코드를 받습니다.

https://www.sqlite.org/download.html

받을 파일은 sqlite-amalgamation-XXXXXXX.zip 입니다.

받으셔서 압축을 풀어보시면 파일이 4개뿐입니다.

shell.c
sqlite3.c
sqlite3.h
sqlite3ext.h

단순하게 프로젝트에 포함시켜도 됩니다. 그런데 이 sqlite3.c 파일은 용량이 어마어마합니다. 소스를 몽땅 한 파일에 넣어서 배포를 한 것이게 때문에 파일 용량이 크며 빌드시간 또한 큽니다. 그래서 dll로 로 만들어 사용하면 빌드시간 단축 여러 프로그램에서 접근시 용량절약 등의 이점이 있습니다.

2. VS 개발자 명령 프롬프트 실행하기

[C] SQLite 라이브러리 빌드하기 : 윈도우 dll 또는 리눅스 so 로 빌드하자

위의 그림처럼 개발자 프롬 프롬프트를 실행합니다.
필자는 Visual Studio 2017로 프로젝트를 진행중입니다.

이제 위의 개발자 프롬프트에서 압축을 풀었던 폴더로 이동합니다.

저는 D:\sqlite-amalgamation-3450300 에 압축을 풀었고요 명령 프롬프트에서 드라이브 전환은 D: 그리고 폴더 전환은 cd D:\sqlite-amalgamation-3450300 입니다.

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.36
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional>d:

D:\>cd D:\sqlite-amalgamation-3450300

D:\sqlite-amalgamation-3450300>

3. DLL 빌드하기

cl sqlite3.c -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll

아주 간단합니다. 위 명령어만 치면 해당 폴더에 sqlite3.dll 이 생성 됩니다.

4. 암시적 링킹하기

여기서 의문이 생깁니다. 단순 dll 을 어떻게 다른 프로젝트에서 링크걸어서 사용을 하지? api 문서를 일일히 찾아서 LoadLibrary(), GetProcAddress(), FreeLibrary()의 세가지 함수를 통해 명시적으로 구현 할 수 있습니다. 그런데 명시적 링킹은 사용하기 너무 어렵습니다.

암시적으로 링킹을 시도하겠습니다. 그러기 위해서 필요한 파일은

sqlite3.dll, sqlite3.lib, sqlite3.h 입니다. sqlite3.lib 을 만들어내야 암시적으로 링크할 수 있겠네요.

먼저 sqlite3.dll 을 이용해서 sqlite3.def 를 만들고 그리고 그 def 파일을 통해서 lib 를 만들어야 합니다.

다음처럼 명령 프롬프트에서 타이핑합니다.

dumpbin /EXPORTS sqlite3.dll /OUT:sqlite3.def

dumpbin 은 이진 파일의 정보를 표시해주는 명령어 입니다.
이제 sqlite3.def 파일이 생성 되었습니다.
그런데 여기서 한가지 작업을 해줘야 합니다.

sqlite3.def를 열어 보면

Dump of file sqlite3.dll

File Type: DLL

  Section contains the following exports for sqlite3.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
         284 number of functions
         284 number of names

    ordinal hint RVA      name

          1    0 000050A0 sqlite3_aggregate_context
          2    1 00004B50 sqlite3_aggregate_count
          .
          .
          .

위와 같은 형식으로 되어 있습니다.
그런데 아래와 같은 형식으로 직접 수정해 주셔야 합니다.

EXPORTS 
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_auto_extension
sqlite3_autovacuum_pages
.
.
.
sqlite3_win32_write_debug

마지막으로 명령 프롬프트에서

lib /def:sqlite3.def /out:sqlite3.lib

이제 sqlite3.lib 가 생성 되었습니다.

모든준비는 끝났습니다.

sqlite3.dll, sqlite3.lib, sqlite3.h 를 다른 프로젝트에서 암시적 링크로 사용 하시면됩니다.

리눅스에서 so 빌드하기

다음 위치에서 소스를 다운받습니다.

https://www.sqlite.org/download.html

dll 빌드때와는 다르게 받을 파일은 sqlite-autoconf-XXXXXX.tar.gz 입니다.

압축을 풀면 여러 파일들이 존재합니다.

이제 Linux 의 특정 폴더에 압축을 풀고 빌드를 시작 하겠습니다.

./configure --prefix=/home/root/sqlite-autoconf-3450300/lib

저는 /home/root/sqlite-autoconf-3450300 폴더에 압축을 푼 상황입니다.
–prefix=/home/root/sqlite-autoconf-3450300/lib 는 최종 output 폴더입니다.

아래 두개의 명령어를 입력합니다.

make
make install

이제 /home/root/sqlite-autoconf-3450300/lib 폴더에 include, lib 폴더들이 잘 정돈된 상태로 존재 합니다.

타 프로젝트에서 해당 lib폴더를 잘 링크해서 사용 하면 되겠습니다.

결론

sqlite 를 dll 또는 so로 빌드하는 방법을 배웠습니다. 이 글이 도움이 되셨기를 기원합니다.

Leave a Comment