[컴파일에러] Postgresql C-api를 static으로 컴파일시 에러?...
- Postgresql을 이용하여 DB를 컨트롤하는 App를 C언어를
이용하여 작성하였습니다. 기존에는 Shared Libray를 사용하였는데 별다른 이상없이 정상적으로 컴파일이 되었습니다.
그런데. 이걸 static으로 컴파일을 한번 해보려 하니.. 링크되어야 하는게 정말 많네요.. 혹 static으로 간단히 되는 방법은 없나요..
컴파일 옵션은 다음과 같습니다.
gcc -I. -I/usr/include -static -g -DDB_POSTGRESQL -o $(TARGET) $(OBJ) -L/usr/lib -lpq
위처럼 하니 다음과 같은 에러가 발생합니다.
: undefined reference to `pthread_mutex_unlock'
/usr/lib/gcc/i386-redhat-linux/4.0.1/libgcc_eh.a(unwind-dw2-fde-glibc.o)(.text+0x90f): In function `__register_frame_info_bases':
: undefined reference to `pthread_mutex_lock'
/usr/lib/gcc/i386-redhat-linux/4.0.1/libgcc_eh.a(unwind-dw2-fde-glibc.o)(.text+0x9f1): In function `__register_frame_info_table_bases':/usr/lib/libpq.a(fe-secure.o)(.text+0xd9c): In function `pq_reset_sigpipe':
/usr/src/build/565044-i386/BUILD/postgresql-8.0.3/src/interfaces/libpq/fe-secure.c:1314: undefined reference to `pthread_sigmask'
/usr/lib/libpq.a(fe-secure.o)(.text+0xe6d): In function `pqsecure_write':
/usr/src/build/565044-i386/BUILD/postgresql-8.0.3/src/interfaces/libpq/fe-secure.c:410: undefined reference to `SSL_write'
/usr/lib/libpq.a(fe-secure.o)(.text+0xe84):/usr/src/build/565044-i386/BUILD/postgresql-8.0.3/src/interfaces/libpq/fe-secure.c:411: undefined reference to `SSL_get_error'
/usr/lib/libpq.a(fe-secure.o)(.text+0x105b): In function `client_cert_cb':
..
.
.
.
-static외에 다른 옵션은 없나요... -lkrb5 -lssl을 추가하여 컴파일을 해보았는데도. 역시나 다른 라이브러리를 계속 찾더군요..
계속이렇게 추가적으로 라이브러리를 추가해야하는지 아니면 다른방법이 있나요?
-static말고 그냥 libpgsql.a 뭐 이런걸 그냥 $(OBJ)안
-static말고 그냥 libpgsql.a 뭐 이런걸 그냥 $(OBJ)안에 넣어주고 컴파일하면 되지 않나요?
libpq.a를 직접 포함하여 컴파일해도 마찬가지로 비슷한 에러가 납니다
libpq.a를 직접 포함하여 컴파일해도 마찬가지로 비슷한 에러가 납니다.
개발자들의 궁극적 비전은 ?
pthread 계열은 -lpthread 로 해주셔야 합니다.sta
pthread 계열은 -lpthread 로 해주셔야 합니다.
static 컴파일은 당연히 각 라이브러리 별로 링크 해주셔야 합니다.
이런걸 간단하게 하기 위해 Makefile 이 존재하는것이지요.
postgresql 쪽의 Makefile 을 분석해보시면
쉽게 알아보실 수 있을겁니다.
Neogeo - Future is Now.
자답입니다.
자답입니다. -static옵션등을 주어 컴파일해도 libpq.a가 많은 라이브러를
포함하여 컴파일되어 있기 때문에 libpq.a만 복사하여 컴파일 하는데
무리가 있었습니다. 해서 다음과 같은 방식으로 컴파일 해서 성공하였습니다.
1. postgresql을 소스로 다운 받아 컴파일 합니다. (install을 하지 않음)
2. 컴파일한 postgresql소스를 포함하려는 소스와 동일한 디렉토리에 위치하게 합니다.
3. 포함하려는 소스에서 libpq.a 위치를 postgresql 소스위치로 설정하여 줍니다. 다음과 같이
../postgresql/interpace/libpq/libpq.a
위와같은 방식으로 하면 별문제없이 컴파일이 가능합니다. 단 postgresql의 소스자체가 분량이 많기 때문에 용량이 커지는 문제가 조금 있습니다.
개발자들의 궁극적 비전은 ?
댓글 달기