툴 : visual studio 2022
서버 : CentOS7.5, Postgresql-11
1. 툴 include 및 lib 설정
속성
[VC++ 디렉토리]
포함 디렉토리 : /usr/pgsql-11/include
라이브러리 디렉토리 :/usr/pgsql-11/lib
[C/C++]
일반 > 추가 포함 디렉토리 : /usr/pgsql-11/include
모든 옵션 > 추가 포함 디렉토리 : /usr/pgsql-11/include
[링커]
일반 > 추가 라이브러리 디렉토리 : /usr/pgsql-11/lib
입력 > 라이브러리 종속성 : pgsql
추가 종속성 : -L/usr/pgsql-11/lib -lpq
2. C 언어
#include
#include
#include
int main() {
const char* conninfo;
PGconn* conn;
PGresult* res;
int nFields;
int i, j;
// 연결 정보 설정 (예시)
conninfo = "dbname=test user=postgres password=test1";
// PostgreSQL 데이터베이스 연결 시도
conn = PQconnectdb(conninfo);
// 연결 상태 확인
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
// SQL 쿼리 실행 (예시)
res = PQexec(conn, "SELECT * FROM mytable");
// 쿼리 결과 상태 확인
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, "SELECT command did not return tuples properly: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
// 결과 필드 수 확인
nFields = PQnfields(res);
// 결과 출력
for (i = 0; i < PQntuples(res); i++) {
for (j = 0; j < nFields; j++)
printf("%s\t", PQgetvalue(res, i, j));
printf("\n");
}
// 결과 해제
PQclear(res);
// 연결 종료
PQfinish(conn);
return 0;
}
OUT 파일로 만들면 정상적으로 실행이 되는데
SO 파일로 만들면 세그멘테이션 오류가 발생합니다.
ldd lib20240714_postgresql.so
linux-vdso.so.1 => (0x00007ffe16be3000)
libpq.so.5 => /usr/pgsql-11/lib/libpq.so.5 (0x00007ff6fae4d000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007ff6fab46000)
libm.so.6 => /lib64/libm.so.6 (0x00007ff6fa844000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ff6fa62e000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff6fa260000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007ff6f9fee000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007ff6f9b8d000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007ff6f9940000)
libldap_r-2.4.so.2 => /lib64/libldap_r-2.4.so.2 (0x00007ff6f96e1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff6f94c5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff6fb299000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007ff6f91dd000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007ff6f8fd9000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007ff6f8da6000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff6f8ba2000)
libz.so.1 => /lib64/libz.so.1 (0x00007ff6f898c000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007ff6f877e000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007ff6f857a000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ff6f8361000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007ff6f8152000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007ff6f7f35000)
libssl3.so => /lib64/libssl3.so (0x00007ff6f7ce7000)
libsmime3.so => /lib64/libsmime3.so (0x00007ff6f7ac0000)
libnss3.so => /lib64/libnss3.so (0x00007ff6f7793000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007ff6f7564000)
libplds4.so => /lib64/libplds4.so (0x00007ff6f7360000)
libplc4.so => /lib64/libplc4.so (0x00007ff6f715b000)
libnspr4.so => /lib64/libnspr4.so (0x00007ff6f6f1d000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007ff6f6cf6000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff6f6abf000)
librt.so.1 => /lib64/librt.so.1 (0x00007ff6f68b7000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007ff6f6655000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007ff6f6452000)
경로도 정상적으로 잡고 있는데
./lib20240714_postgresql.so 이렇게 실행하면 세그멘테이션 오류로 발생하고
Visual studio에서도 so 파일은 생성되지만 세그멘테이션 오류로 팝업 창이 발생합니다.
gdb로 실행하면 아래와 같이 나오는데 확인 부탁드립니다.
해당 라이브러리를 Postgresql에서 정상 호출된다면
비밀번호 재사용방지, 로그인 실패횟수 체크 등 기능을 추가적으로 개발하려고 합니다.
gdb ./lib20240714_postgresql.so
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /root/projects/20240714_postgresql/bin/x64/Release/lib20240714_postgresql.so...done.
(gdb)
|