SQLite 빌더하기

< DEF 파일을 통해 동적 라이브러리 생성하기 >

최신버전의 DLL 파일과 소스 파일을 다운 받아서 Visual C++ 2005에서 빌드해 보자.

http://www.sqlite.org/download.html   이동해서 파일을 받는다.

Source Code 항목에서 sqlite-amalgamation-3_6_22.zip 파일을 다운받는다.
Precompiled Binaries For Windows 항목에서 sqlitedll-3_6_22.zip 파일을 다운받는다.

폴더에 압축을 풀면 다섯 개의 파일이 보일 것이다.

sqlite3.c
sqlite3.def
sqlite3.dll
sqlite3.h
sqlite3ext.h

"Visual Studio 2005 명령 프롬프트"를 열어서 .lib 파일을 생성한다.

LIB /DEF:sqlite3.def /MACHINE:x86

D:\web\file\algorithm\SQLite\SQLite_build>LIB /DEF:sqlite3.def /MACHINE:x86

그러면 sqlite3.exp, sqlite3.lib 파일 2개가 생성될 것이다.

비쥬얼 스튜디오에서 프로젝트를 생성후 sqlite3.h 파일을 포함시키고 sqlite3.lib 라이브러리도 포함 시킨다.
콜백 함수를 선언해 준다.

SQLite에서  질의를 하면 콜백 함수를 통해 데이터를 넘겨 준다.
여기서 콜백 함수 이름은  "callback"이다.

#include <stdio.h>

#include <iostream>

#include <windows.h>

#include "common/sqlite3.h"

 

#pragma comment(lib, "sqlite3.lib")

 

static int callback( void* NotUsed, int argc, char** argv, char** azColName )

{

    char szTrace[300];

    for( int i = 0; i < argc; i++ )

    {

        sprintf_s( szTrace, 300, "%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL" );

        OutputDebugStringA( szTrace );

    }

    return 0;

}

 

void main()

{

#if  0

    //파일 DB 사용시

    const char* dbfile = "customer.db";

#else

    //메모리 DB 사용시

    const char* dbfile = ":memory:";

#endif

 

    sqlite3*    pSQLite3 = NULL;  //SQLite DB 객체 저장 변수

    char*        szErrMsg = NULL;    //Error 발생시 메세지를 저장하는 변수

 

    //데이터베이스 열기 : 파일이 존재하지 않으면 생성한다.

    int    rst = sqlite3_open( dbfile, &pSQLite3 );

 

    char szTrace[300];

    if( rst )

    {

        sprintf_s( szTrace, 300, "Can't Open database: %s\n", sqlite3_errmsg( pSQLite3 ));

        OutputDebugStringA( szTrace );

        sqlite3_close( pSQLite3 );

        pSQLite3 = NULL;

    }

    else

    {

        OutputDebugStringA( "\nDatabase opened!!\n");

 

        //테이블 생성

        rst = sqlite3_exec( pSQLite3, "CREATE TABLE member ( name TEXT(20), age INTEGER )", callback, 0, &szErrMsg);

 

        //데이터 삽입

        rst = sqlite3_exec( pSQLite3, "INSERT INTO member ( name, age ) values ( 'andy', 20 )", callback, 0, &szErrMsg);

 

        //데이터  질의

        rst = sqlite3_exec( pSQLite3, "SELECT * FROM member", callback, 0, &szErrMsg);

        if( rst == 0 )

        {

            OutputDebugStringA( "성공적으로 찾기까지 실행\" );

        }

    }

}

소스:  SQLite_build.zip

 

< SQLite 3.6.22 소스로 스택틱 라이브러리 생성하기 >

동적인 라이브러리를 사용하지 않고 스텍틱 라이브러리를 생성 할려면  SQLite 소스 자체를 빌드해야 한다.
여기서는 sqlite-source-3_6_22.zip을 다운로드 받는다.

1. 비쥬얼 스튜디오 2005에서 Win32 Console Application 프로젝트를 만든다.

2. "Win32 응용 프로그램 마법사"에서 "응용 프로그램 설정" 탭에서 다음을 설정한다.
  "응용 프로그램 종류"는 "정적 라이브러리(S)"를 선택
  "추가 옵션"에서는 "미리 컴파일된 헤더(P)"는 체크를 해제 한다.

3. 다운로드 받은 sqlite 소스를 프로젝트에 추가한다.
  여기서 tclsqlite.c 파일은 프로젝트에서 제외한다.

4. 프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 전처리기에 NO_TCL을 추가한다.
   TCL은 사용하지 않으므로 TCL 관련 해서 제외시킨다.

5. 라이브러리 관리자 -> 일반 -> 출력파일에서  출력 라이브러리 이름을 수정한다.
다음과 같이 바꾼다.

릴리즈에서는 $(OutDir)\staticSQLite_R.lib
디버그에서는 $(OutDir)\staticSQLite_D.lib

6. 프로젝트 --> 속성 --> C/C++ --> 출력 파일 --> 프로그램 데이터베이스 파일이름   이름 수정.
디버거 : vc80.pdb --> staticsqlite_d.pdb
릴리즈: vc80.pdb --> staticsqlite_r.pdb

7. 프로그램 데이터베이스 파일 ( staticsqlite_d.pdb, staticsqlite_r.pdb ) 파일을 라이브러리와 같은 폴더에 둔다.

SQLite 동적 라이브러리를 사용하던 sqlitte_build 프로젝트를 SQLite 정적 라이브러리를 사용하는 사용하는 것으로 바꾼다.

#pragma comment(lib, "sqlite3.lib") 코드를 아래와 같이 수정한다.

#ifdef _DEBUG

#pragma comment(lib, "staticSQLite_D.lib")

#else

#pragma comment(lib, "staticSQLite_R.lib")

#endif

소스:  sqlite-source-3_6_22 스태틱 라이브러리(  static_sqlite3_6_22.zip )

소스: 스태틱 SQLitte 라이브러리를 사용한 테스트( SQLite_staticbuild.zip )

<참고, 펌>
http://neodreamer.tistory.com/128

http://www.redef.pe.kr/301

<참고: PDB 파일 설명>

프로그램  데이터베이스 파일은 2가지가 있다. 라이브러리를 만들때 필요한 pdb 파일은 C++항목에서 만든 pdb 파일이 필요하다.

라이브러리를 이용하여 빌드할 때 라아브러리의 *.pdb 파일이 없다면 다음과 같은 에러가 뜰 것이다.

staticSQLite_D.lib(where.obj) : warning LNK4099: 'staticsqlite_d.pdb' PDB를 './common\staticSQLite_D.lib' 또는 'd:\web\file\algorithm\sqlite\tutorial02\새 폴더\debug\staticsqlite_d.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다.

pdb 파일은 라이브러리와 같은 폴더에 두던지, .실행 프로젝트의 *.obj 와 같은 폴더에 두면 된다.

pdb 파일 설명 링크: http://msdn.microsoft.com/ko-kr/library/yd4f8bd1.aspx

프로젝트 --> 속성 --> C/C++ --> 출력 파일 --> 프로그램 데이터베이스 파일이름 위치의 pdb 파일
VC80.PDB. 일반적으로 표현하면 VCx0.PDB이고, 여기서 x는 Visual C++의 버전을 나타낸다.
이 파일에는 각 OBJ 파일에 대한 디버깅 정보가 모두 들어 있으며, 프로젝트 메이크파일과 동일한 디렉터리에 저장된다.

프로젝트 --> 링커 --> 디버깅 --> 프로그램 데이터베이스 파일 생성 위치의 pdb 파일
project.PDB. 이 파일에는 .exe 파일에 대한 디버그 정보가 모두 저장됩니다. C/C++의 경우에는 \debug 하위 디렉터리에 이 파일이 저장된다.