반응형
PostgreSQL 11 이상부터 x64 윈도우 플랫폼에서만 지원하고 TimescaleDB를 이용하기 위해서는 PostgreSQL 12 이상이어야 한다. 따라서 TimescaleDB는 x64 윈도우 플랫폼에서 돌아가는 MFC에서만 사용할 수 있다.
PostgreSQL은 14 버전을 이용하였으며, 아래의 경로에서 다운로드하였다.
https://www.postgresql.org/download/windows/
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) 이여야 한다.
반응형
'프로그래밍 > MFC' 카테고리의 다른 글
x86 MFC에서 PostgreSQL 사용하기 (0) | 2022.04.03 |
---|---|
MFC에서 여러 라이브러리를 사용하기 위한 CMake 방법 (0) | 2022.03.26 |
댓글