본문 바로가기
프로그래밍/MFC

MFC에서 TimescaleDB 사용하기

by 남생 namsaeng 2022. 4. 3.
반응형

PostgreSQL 11 이상부터 x64 윈도우 플랫폼에서만 지원하고 TimescaleDB를 이용하기 위해서는 PostgreSQL 12 이상이어야 한다. 따라서 TimescaleDB는 x64 윈도우 플랫폼에서 돌아가는 MFC에서만 사용할 수 있다.

PostgreSQL은 14 버전을 이용하였으며, 아래의 경로에서 다운로드하였다.
https://www.postgresql.org/download/windows/

PostgreSQL: Windows installers

Windows installers Interactive installer by EDB Download the installer certified by EDB for all supported PostgreSQL versions. Note! This installer is hosted by EDB and not on the PostgreSQL community servers. If you have issues with the website it's hoste

www.postgresql.org


1. libpqxx 다운로드한 경로 설정 및 build 파일 경로 설정하고 x64 플랫폼으로 구성한다.

2. "Configure"를 완료하면 아래와 같은 오류가 발생한다.

CMake Error at C:/Program Files/CMake/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find PostgreSQL (missing: PostgreSQL_LIBRARY PostgreSQL_INCLUDE_DIR)Call Stack (most recent call first): C:/Program Files/CMake/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)

C:/Program Files/CMake/share/cmake-3.23/Modules/FindPostgreSQL.cmake:269 (find_package_handle_standard_args)
cmake/config.cmake:26 (find_package) CMakeLists.txt:27 (include)

3. 오류가 난 상태에서 [Add Entry]로 엔트리를 추가해준다.

  • PostgreSQL_INCLUDE_DIR 및 PostgreSQL_LIBRARY가 포함되어 있는지 확인하고 각각 위치해 있는 경로를 값으로 넣어준다.
PostgreSQL_INCLUDE_DIR- Only when building with PostgreSQL; directory that contains libpq-fe.h
PostgreSQL_LIBRARY- Only when building with PostgreSQL; path to libpq.a/libpq.so/libpq.lib

  • Entry 설정 예시

4. 설정을 하고 "Generate"를 클릭하면 Entry 목록이 아래 그림처럼 바뀌고 경고도 발생한다.

  • Entry 목록

  • 경고 내용
CMake Warning at src/CMakeLists.txt:29 (target_link_libraries): Target "pqxx" requests linking to directory "C:/Program Files/PostgreSQL/14/lib". Targets may link only to libraries. CMake is dropping the item.Call Stack (most recent call first): src/CMakeLists.txt:74 (library_target_setup)

CMake Warning at src/CMakeLists.txt:29 (target_link_libraries): Target "pqxx" requests linking to directory "C:/Program Files/PostgreSQL/14/lib". Targets may link only to libraries. CMake is dropping the item.Call Stack (most recent call first): src/CMakeLists.txt:74 (library_target_setup)

CMake Warning at src/CMakeLists.txt:29 (target_link_libraries): Target "pqxx" requests linking to directory "C:/Program Files/PostgreSQL/14/lib". Targets may link only to libraries. CMake is dropping the item.Call Stack (most recent call first): src/CMakeLists.txt:74 (library_target_setup)

CMake Warning at src/CMakeLists.txt:29 (target_link_libraries): Target "pqxx" requests linking to directory "C:/Program Files/PostgreSQL/14/lib". Targets may link only to libraries. CMake is dropping the item.Call Stack (most recent call first): src/CMakeLists.txt:74 (library_target_setup)

5. 경고를 무시하고 “Open Project”를 클릭한다. "ALL_BUILD"와 "INSTALL" 프로젝트 각각 [구성 속성] > [고급] > [MFC 사용] 및 [구성 속성] > [C/C++] > [코드 생성] > [런타임 라이브러리]를 맞춰줌.


6. 우리의 MFC 프로젝트에 상기 라이브러리를 사용하기 위해 아래의 절차를 수행한다.

[ (YourProjectDir)/includes 경로에 복사]
1) C:\Users\SIU\Desktop\temp\libpqxx\include\pqxx


[ (YourProjectDir)/includes/pqxx 경로에 복사]
1) C:\Program Files\PostgreSQL\14\lib\libpq.lib
2) C:\Users\SIU\Desktop\temp\libpqxx\lib\pqxx.lib

7. 우리의 MFC 프로젝트의 속성을 변경해준다.

  • [구성 속성] > [일반] > [C++ 언어 표준] > [ISO C++ 17 표준(/std:c++17)]

  • [구성 속성] > [VC++ 디렉터리] > [포함 디렉터리] > [(YourProjectDir)/includes 경로 추가]
  • [구성 속성] > [VC++ 디렉터리] > [라이브러리 디렉터리] > [(YourProjectDir)/includes 경로 추가]

  • [구성 속성] > [C/C++] > [일반] > [추가 포함 디렉터리] > [(YourProjectDir)/includes 경로]

  • [구성 속성] > [C/C++] > [링커] > [입력] > [추가 종속성] > [(YourProjectDir)/includes/pqxx/pqxx.lib 추가]
  • [구성 속성] > [C/C++] > [링커] > [입력] > [추가 종속성] > [(YourProjectDir)/includes/pqxx/libpq.lib 추가]


  • C++ 소스코드
#include <pqxx/pqxx>
using namespace pqxx;

// in function
connection C(“dbname = example user = postgres password = 1234 hostaddr = 192.168.1.2 port = 5432”);
if(C.is_open()){
	cout << “Opened database successfully: ” << C.dbname() << endl;
}
else {
	cout << “Cant’ open database” << endl;
}

work work{ C };

	pqxx::result result_v = work.exec("select time, varchar_content, bytea_content from test2");

	for (pqxx::result::const_iterator iter = result_v.begin(); iter != result_v.end(); iter++) {
		cout << "time = " << iter[0].as<string>() << endl;
		cout << "varchar_content = " << iter[1].as<string>() << endl;
		cout << "bytea_content = " << iter[2].as<string>() << endl;
	}

C.close();

  • 코드 실행 결과
Opened database successfully: example
time = 2022-03-22 12:17:21.922064
varchar_content = Regular BitField Test
bytea_content = \xeeb3153c



8. x86 플랫폼에 사용해보기 위하여 Win32로 선택하고 "Generate"를 클릭했다.

9. 상기 C++ 소스코드를 이용하여 빌드를 시도하였지만, 아래와 같은 오류가 발생했다. 애초에 PostgreSQL 라이브러리인 libpq.lib이 x86와 충돌이 되어서 컴파일이 안된다.

  • 컴파일 에러 화면

  • 컴파일 에러 목록 및 종류
LNK4272 'x64' 라이브러리 컴퓨터 종류가 'x86' 대상 컴퓨터 종류와 충돌합니다. C:\Users\SIU\source\repos\postgre_32bit_test\postgre_32bit_test\includes\pqxx\libpq.lib
E1919 매개 변수 팩 "Args"이(가) 참조되었지만 확장되지 않았습니다. C:\Users\SIU\source\repos\postgre_32bit_test\postgre_32bit_test\includes\pqxx\internal\conversions.hxx
LNK2038 'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MDd_DynamicDebug' 값이 'MTd_StaticDebug'(postgre_32bit_test.obj에 위치) 값과 일치하지 않습니다. C:\Users\SIU\source\repos\postgre_32bit_test\postgre_32bit_test\pqxx.lib(strconv.obj)
LNK2038 'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MDd_DynamicDebug' 값이 'MTd_StaticDebug'(postgre_32bit_test.obj에 위치) 값과 일치하지 않습니다. C:\Users\SIU\source\repos\postgre_32bit_test\postgre_32bit_test\pqxx.lib(except.obj)


* 결론 : TimescaleDB를 이용하기 위해서는 PostgreSQL 12 버전 이상을 이용해야 하고, x64 윈도우 플랫폼에서 돌아가는 MFC에서 사용해야 한다. 또한, 동적 라이브러리 사용 및 다중 스레드 디버그 DLL (/MDd) 이여야 한다.









반응형

댓글