Kori 9월 4일, 2021에 포스트됨 공유하기 9월 4일, 2021에 포스트됨 원본: 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 라이브러리 받아오기 C++빌더에서 프로젝트 설정하기 소스 파일 선택하기 SQLiteCpp 라이브러리를 빌드하기 빌드한 SQLiteCpp 라이브러리를 사용하기 최종 의견 SQLiteCpp 란? SQLiteCpp는 SQLite 데이터베이스의 C 라이브러리를 둘러싼 C++ RAII 래퍼로써, SQLite를 연결하는 훌륭한 C++ 인터페이스를 제공한다. SQLite는 사용과 통합이 쉬운 데이터베이스로써, 다양한 유형의 데이터를 저장, 쿼리 및 검색할 수 있기 때문에, 임베디드 프로젝트에서 주류 애플리케이션에 이르기까지 다양한 애플리케이션에서 사용된다. 이제, 데이터를 저장하고 검색하는 간단한 콘솔 애플리케이션을 C++빌더와 SQLiteCpp를 사용하여 만들어보자. SQLiteCpp 라이브러리 받아오기 SQLiteCpp를 애플리케이션으로 컴파일하기 위해 필요한 모든 파일은 Github의 리포지포리에 있다. 1. https://github.com/SRombauts/SQLiteCpp로 간다. 2. 최신 릴리스를 다운로드하고 폴더에 압축을 푼다. C++빌더에서 프로젝트 설정하기 SQLiteCpp는 CMake 빌드 시스템을 지원하므로, C++빌더에서 CMake를 사용하여 SQLiteCpp를 빌드할 수도 있지만, 지금은 직접 만들기로 하자. 더 재미있고 직접적일 뿐만 아니라 용도에 맞게 빌드를 커스터마이징할 수 있다는 장점도 있다. 3. 압축을 푼 폴더 안에 cbuilder라는 폴더를 만든다. 곧 여기에 C++빌더의 프로젝트 파일을 넣을 것이다. 최종 폴더 구조는 다음과 같아야 한다. 그림1. SQLiteCpp 폴더 안에 cbuilder 폴더를 만든다. 4. 깃허브에서 받은 라이브러리를 정적 라이브러리로 빌드하여, C++빌더에서 링크할 수 있도록 해보자. 먼저 RAD 스튜디오를 실행하고 New Static Library Project를 생성한다. 이 프로젝트 파일 이름은 sqlitecpp.cbproj 로 하고 cbuilder 폴더 안에 저장한다. 5. RAD 스튜디오의 Project Options 안의 Building > C++ Compiler 설정으로 이동하여, All configurations에서 CLANG 컴파일러가 사용되도록 지정한다. 그림2. C++빌더에서 CLANG 컴파일러를 사용하도록 지정하기 6. Building > Librarian 설정으로 이동하여, 페이지 크기를 64로 설정한다(경험상 그렇다. - 만약 여기에서 설정할 페이지 크기를 정확히 알지 못한 경우에는, 프로젝트를 빌드할 때 페이지 크기를 조정해야 하는지 여부를 TLIB 링커가 알려준다) 그림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 라이브러리를 빌드하기 지금 이 라이브러리를 빌드하려고 하면 다음과 유사한 오류가 발생할 것이다. 그림4. 컴파일러 에러 Building > C++ Shared Options 설정으로 이동하여, include path를 설정해야 한다. 8. include path를 설정한다. 눈치 챘겠지만, 이 프로젝트에는 include 폴더가 하나 있는데, 위치는 src 폴더가 있는 위치와 같다. 프로젝트의 include path에 이 include 폴더를 추가해야 여기에 있는 헤더를 찾을 수 있다. 그림5. SQLiteCpp의 include path들 9. 프로젝트를 빌드한다. 성공적으로 완료될 것이다. 축하한다. 이제 SQLiteCpp 라이브러리가 생겼다. 그림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 라이브러리가 잘 작동하는 지 확인한다. 그림7. SQLiteCpp를 사용한 애플리케이션에서 데이터 조회가 잘 되는 것을 확인했다. 최종 의견 이 간단한 실습에서 본 것 처럼, C++빌더에서 CLANG 컴파일러를 사용하면, 다양한 라이브러리와 프레임워크를 사용할 수 있는 세상이 열린다. C++빌더에서 오픈 소스 C++ 라이브러리인 SQLiteCpp를 컴파일하고 애플리케이션에 넣어서 작동시키는 동안 우리는 코드 한줄도 변경할 필요가 없었다. 세상에는 다른 C++ 프로젝트가 수천가지도 넘는다. 알맞은 C++ 프로젝트를 찾아서 시도해보기를 권한다! 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.