Автор Тема: Postgresql 9.6, компиляция программы с libpq [решено]  (Прочитано 1669 раз)

Оффлайн slav01

  • Завсегдатай
  • *
  • Сообщений: 68
Перешёл на p8.

Пакеты

[slav@slav-pc c]$ rpm -qa | grep postgresql
postgresql9.6-devel-9.6.3-alt0.M80P.2
postgresql-common-1.0-alt8
postgresql9.6-9.6.3-alt0.M80P.2
postgresql9.6-server-9.6.3-alt0.M80P.2

libpq

[slav@slav-pc c]$ rpm -qa | grep libpq
libpq5.9-devel-static-9.6.3-alt0.M80P.2
libpq5.9-9.6.3-alt0.M80P.2
libpq5.9-devel-9.6.3-alt0.M80P.2

Пути

[root@slav-pc data]# pg_config --includedir
/usr/include/pgsql

[root@slav-pc data]# pg_config --libdir
/usr/lib64

В коде:

#include </usr/include/pgsql/libpq-fe.h>
...
  // Postgresql
  PGconn* conn;
  PGresult* res;

  conn = PQconnectdb("dbname = postgres");

  if( PQstatus(conn) != CONNECTION_OK ) {

    printf("Connection failed: %s\n", PQerrorMessage( conn ) );
    PQfinish( conn );   
    exit(1);
  }

  printf( "Connection OK!" );

Компиляция

[root@slav-pc c]# gcc -o server server.c
/tmp/.private/root/ccQIYvLq.o: In function `main':
server.c:(.text+0xe0a): undefined reference to `PQconnectdb'
server.c:(.text+0xe20): undefined reference to `PQstatus'
server.c:(.text+0xe33): undefined reference to `PQerrorMessage'
server.c:(.text+0xe54): undefined reference to `PQfinish'
collect2: error: ld returned 1 exit status

Заголовки нашёл.

Не нашёл либы..

Далее по инструкции
https://www.postgresql.org/docs/9.6/static/libpq-build.html

[root@slav-pc c]# gcc -o server -L/usr/lib64 -lpq server.c
/tmp/.private/root/cc5fPbsk.o: In function `main':
server.c:(.text+0xe0a): undefined reference to `PQconnectdb'
server.c:(.text+0xe20): undefined reference to `PQstatus'
server.c:(.text+0xe33): undefined reference to `PQerrorMessage'
server.c:(.text+0xe54): undefined reference to `PQfinish'
collect2: error: ld returned 1 exit status

..что не так?..
« Последнее редактирование: 16.07.2017 06:58:40 от Skull »

Онлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 920
    • Домашняя страница
    • Email
Нет таких функций в новых библиотеках (смотрел через objdump -T). Надо документацию смотреть, со смартфона так навскидку не получается. И лучше флаги брать из pkg-config --cflags --libs pq (пишу по памяти)
Андрей Черепанов (cas@)

Оффлайн slav01

  • Завсегдатай
  • *
  • Сообщений: 68
хм.. у меня есть..

[root@slav-pc lib64]# ldconfig -p | grep libpq
libpq.so.5 (libc6,x86-64) => /usr/lib64/libpq.so.5
libpq.so (libc6,x86-64) => /usr/lib64/libpq.so

[root@slav-pc lib64]# objdump -T libpq.so | grep -E 'PQconnectdb|PQstatus|PQerrorMessage|PQfinish'
000000000000ca90 g    DF .text 0000000000000016  Base        PQstatus
000000000000c670 g    DF .text 0000000000000022  Base        PQfinish
0000000000010040 g    DF .text 0000000000000024  Base        PQconnectdbParams
0000000000010100 g    DF .text 0000000000000024  Base        PQconnectdb
000000000000cbb0 g    DF .text 000000000000001c  Base        PQerrorMessage

[root@slav-pc lib64]# pkg-config --libs --cflags libpq
-I/usr/include/pgsql  -lpq 

[slav@slav-pc c]$ gcc -o server -I/usr/include/pgsql -lpq server.c
/tmp/.private/slav/ccMlwRnO.o: In function `main':
server.c:(.text+0xe0a): undefined reference to `PQconnectdb'
server.c:(.text+0xe20): undefined reference to `PQstatus'
server.c:(.text+0xe33): undefined reference to `PQerrorMessage'
server.c:(.text+0xe54): undefined reference to `PQfinish'
collect2: error: ld returned 1 exit status

-------------------
я впервые собираю через gcc, и есть подозрение, что допускаю какую-то ошибку..  :rolleyes:

Оффлайн slav01

  • Завсегдатай
  • *
  • Сообщений: 68
Всё, я собрал  :-)

Ошибка у меня в команде gcc

-o надо в конце писать

т.е.

[slav@slav-pc c]$ gcc server.c -I/usr/include/pgsql -lpq -o server
и

include <libpq-fe.h>
Вот так всё собирается. :-)

Все либы на месте, и всё хорошо. :-)