Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

많이 쓰는 외부 C++ 라이브러리를 C++빌더와 TwineCompile에서 사용하기


Recommended Posts

원본: Using a Common C++ Library with C++Builder and TwineCompile - 2021년 3월 23일, Jonathan Benedicto

C++이애플리케이션과 프로젝트에서 많이 사용되는 이유 또는 장점 중 하나로 방대한 C++ 라이브러리 및 프레임워크에 액세스할 수 있다는 점을 들 수있다. 어떤 목적이든지 거의 모든 필요한 C++ 라이브러리를 찾을 수 있다. 혹시 C++ 라이브러리가 없다면 적어도 C 라이브러리는 있다.

과거에는 서로 다른 C++ 컴파일러 간의 호환성 차이로 인해 서로 다른 라이브러리를 C++ 프로젝트에 통합하기가 어려운 것이 대부분이었다. GCC에서 빌드한 프로젝트는 VC++에서 컴파일하는 데 문제가 있었고, VC++에서 빌드한 프로젝트는 BCC 등에서 컴파일하는 데 문제가 있었다. 그 시절은 이미 오래 전이었고, 고맙게도 이제는 C++ 컴파일러들이 서로 상당한 수준의 호환성을 갖게 되었다. 

C++빌더에서 사용되는 CLANG 역시 예외가 아니다. C++빌더의 컴파일러 중 클래식 컴파일러는 최신 C++ 구문에 문제가 있는 경우가 현재 종종 있지만, CLANG 컴파일러는 오늘날 사용되고 있는 C++ 컴파일러들 중 가장 표준을 준수하는 컴파일러 중 하나이다. 그 결과 방대한 C++ 라이브러리의 세상이 C++빌더 프로젝트에게 활짝 열렸다.

프로젝트에서 외부 라이브러리를 사용하려면 몇 가지 트릭과 조정이 필요한 것이 사실이지만 과거와 비교하면 너무나 쉬워졌다.

많이 사용되는 C++ 라이브러리 중 하나인 SQLiteCpp를 C++빌더 프로젝트에서 작동하도록 하는 과정을 이제부터 설명하겠다.

목차


SQLiteCpp 란?

SQLiteCpp는 SQLite 데이터베이스의 C 라이브러리를 둘러싼 C++ RAII 래퍼로써,  SQLite를 연결하는 훌륭한 C++ 인터페이스를 제공한다.

SQLite는 사용과 통합이 쉬운 데이터베이스로써, 다양한 유형의 데이터를 저장, 쿼리 및 검색할 수 있기 때문에, 임베디드 프로젝트에서 주류 애플리케이션에 이르기까지 다양한 애플리케이션에서 사용된다. 

이제, 데이터를 저장하고 검색하는 간단한 콘솔 애플리케이션을 C++빌더와 SQLiteCpp를 사용하여 만들어보자.

SQLiteCpp 라이브러리 받아오기 

SQLiteCpp를 애플리케이션으로 컴파일하기 위해 필요한 모든 파일은 Github의 리포지포리에 있다.

1https://github.com/SRombauts/SQLiteCpp로 간다.

2. 최신 릴리스를 다운로드하고 폴더에 압축을 푼다. 

C++빌더에서 프로젝트 설정하기 

SQLiteCpp는 CMake 빌드 시스템을 지원하므로, C++빌더에서 CMake를 사용하여 SQLiteCpp를 빌드할 수도 있지만, 지금은 직접 만들기로 하자. 더 재미있고 직접적일 뿐만 아니라 용도에 맞게 빌드를 커스터마이징할 수 있다는 장점도 있다. 

3. 압축을 푼 폴더 안에 cbuilder라는 폴더를 만든다. 곧 여기에 C++빌더의 프로젝트 파일을 넣을 것이다. 최종 폴더 구조는 다음과 같아야 한다.

file1-1758159.png
그림1. SQLiteCpp 폴더 안에 cbuilder 폴더를 만든다.

4. 깃허브에서 받은 라이브러리를 정적 라이브러리로 빌드하여, C++빌더에서 링크할 수 있도록 해보자. 먼저 RAD 스튜디오를 실행하고 New Static Library Project를 생성한다. 이 프로젝트 파일 이름은 sqlitecpp.cbproj 로 하고 cbuilder 폴더 안에 저장한다. 

5. RAD 스튜디오의 Project Options 안의 Building > C++ Compiler 설정으로 이동하여, All configurations에서 CLANG 컴파일러가 사용되도록 지정한다. 

file2-1593485.png
그림2. C++빌더에서 CLANG 컴파일러를 사용하도록 지정하기

6. Building > Librarian 설정으로 이동하여, 페이지 크기를 64로 설정한다(경험상 그렇다. - 만약 여기에서 설정할 페이지 크기를 정확히 알지 못한 경우에는, 프로젝트를 빌드할 때 페이지 크기를 조정해야 하는지 여부를 TLIB 링커가 알려준다)

file3-1964903.png
그림3. TLIB (라이브러리) 페이지 크기

소스 파일 선택하기

프로젝트 설정이 끝났다. 이제는 프로젝트 안에 필요한 소스 파일을 넣어서 컴파일 할 차례이다. 무슨 파일을 포함해야 할 지는 프로젝트마다 다르며, 올바른 파일을 결정하려면 깊이 살펴보아야 할 수도 있다. 이때 CMakeLists.txt 파일이 확실히 도움이 된다. 아래의 안내를 참조하자. 

  • src 폴더 아래에, 확장자가 .c, .cpp 또는 .cxx인 파일이 필요한 소스 파일이다.
  • main() 메서드가 포함된 파일은 무시한다. main() 메소드가 있는 파일은 대체로 테스트, 데모 또는 예제 파일이므로 독립적으로 실행되는 애플리케이션을 위한 파일이기 때문이다.

SQLiteCpp의 경우 포함해야 할 소스 파일은 다음과 같다.

  • sqlite3/sqlite3.c 
  • src/Transaction.cpp 
  • src/Backup.cpp 
  • src/Column.cpp 
  • src/Database.cpp 
  • src/Exception.cpp 
  • src/Statement.cpp 

7. 앞에서 만든 라이브러리 프로젝트에 이 파일들을 추가한다. 

SQLiteCpp 라이브러리를 빌드하기

지금 이 라이브러리를 빌드하려고 하면 다음과 유사한 오류가 발생할 것이다.

file4-2602399.png
그림4. 컴파일러 에러

Building > C++ Shared Options 설정으로 이동하여, include path를 설정해야 한다. 

8. include path를 설정한다. 눈치 챘겠지만, 이 프로젝트에는 include 폴더가 하나 있는데, 위치는 src 폴더가 있는 위치와 같다. 프로젝트의  include path에 이 include 폴더를 추가해야 여기에 있는 헤더를 찾을 수 있다.

file5-1936251.png
그림5. SQLiteCpp의 include path들

9. 프로젝트를 빌드한다. 성공적으로 완료될 것이다. 축하한다. 이제 SQLiteCpp 라이브러리가 생겼다.

file6-2491220.png
그림6. SQLiteCpp 빌드 성공

빌드한 SQLiteCpp 라이브러리를 사용하기

이제 라이브러리가 있으므로, 이 라이브러리를 테스트할 간단한 애플리케이션을 만들어보자. 

10. 라이브러리 프로젝트가 들어있는 Project group에서 New C++ console application을 만든다. 새로 만드는 콘솔 애플리케이션에서 사용할 프레임워크로는 Visual Component Library를 선택한다(SQLiteCpp 라이브러리가 VCL과 함께 작동하는 지 확인하기 위해서이다).

11. 이 프로젝트 파일 이름를 test_sqlite.cbproj 로 하고 cbuilder 폴더 안에 저장한다.

12. 이 프로젝트의 Project Options로 이동하여, include path에 ..include를 추가하고, 이 프로젝트 역시 SQLiteCpp 라이브러리 프로젝트에서 설정한 것과 같이 CLANG 컴파일러를 사용하도록 지정한다.

13. 테스트 프로젝트의 C++ 파일 상단의 include 경로가 있는 곳에 SQLiteCpp 라이브러리 include도 추가한다.

#include <vcl.h> 
#include <windows.h>
 
#pragma hdrstop 
#pragma argsused
 
#include <tchar.h> 
#include <stdio.h> 
#include <conio.h> 
 
#include <SQLiteCpp/SQLiteCpp.h> 
#pragma link "sqlitecpp.lib" 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
}

팁! SQLiteCpp 라이브러리 프로젝트에서 컴파일러에게 sqlitecpp.lib 라이브러리를 링크해야 한다고 알리기 위해, 여기에서는 #pragma link 코드를 사용했다. 이 코드 대신, 이 테스트 프로젝트에 SQLiteCpp.lib 파일을 직접 추가해도 되지만, #pragma link 코드 한줄을 쓰는 편이 더 편하다. 

14. 이제 데이터베이스를 하나 생성하고, 데이터를 넣고 다시 읽어오는 코드 몇줄을 추가한다. 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // Open a database file in create/write mode 
    SQLite::Database db("test.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);  std::cout << "SQLite database file " << db.getFilename().c_str() << "n"; 
 
    // Create a new table with an explicit "id" column aliasing the underlying rowid  db.exec("DROP TABLE IF EXISTS test"); 
    db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)"); 
 
    // first row 
    db.exec("INSERT INTO test VALUES (NULL, "test")"); 
 
    // second row 
    db.exec("INSERT INTO test VALUES (NULL, "second")"); 
 
    // update the second row 
    db.exec("UPDATE test SET value="second-updated" WHERE id='2'"); 
 
    // Check the results : expect two row of result 
    SQLite::Statement query(db, "SELECT * FROM test"); 
 
    std::cout << "SELECT * FROM test :n"; 
    while (query.executeStep()) 
    { 
        std::cout << "row (" 
            << query.getColumn(0) << ", "" 
            << query.getColumn(1) << "")n"; 
    } 
 
    getch();
 
    return 0; 
} 

15. 마지막으로, 프로젝트를 실행하여 테스트 애플리케이션을 컴파일하고 작동시킨 후, SQLiteCpp 라이브러리가 잘 작동하는 지 확인한다.

file7-1210431.png
그림7. SQLiteCpp를 사용한 애플리케이션에서 데이터 조회가 잘 되는 것을 확인했다.

최종 의견 

이 간단한 실습에서 본 것 처럼, C++빌더에서 CLANG 컴파일러를 사용하면, 다양한 라이브러리와 프레임워크를 사용할 수 있는 세상이 열린다. C++빌더에서 오픈 소스 C++ 라이브러리인 SQLiteCpp를 컴파일하고 애플리케이션에 넣어서 작동시키는 동안 우리는 코드 한줄도 변경할 필요가 없었다. 

세상에는 다른 C++ 프로젝트가 수천가지도 넘는다. 알맞은 C++ 프로젝트를 찾아서 시도해보기를 권한다!

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.