неопределенная ссылка на `PQclear ', компилирующую простую программу' C 'с вызовами Postgres 10 - PullRequest
0 голосов
/ 02 июня 2018

Простая программа на C, которая компилируется и работает на Debian Linux.Мне нужно, чтобы он работал в Windows, но я получаю следующее при компиляции.Кажется, это общая проблема, но я пока не нашел решения.

Если я использую

#include <libpq-fe.h>

, я получаю

C:\Users\Martin\Desktop\cl>gcc -o test2 test2.c
test2.c:3:22: fatal error: libpq-fe.h: No such file or directory
 #include <libpq-fe.h>

Если я использую

#include "C:\Program Files\PostgreSQL\10\include\libpq-fe.h"

Я получаю

C:\Users\Martin\Desktop\cl>gcc -o test2 test2.c
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0xd): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x18): undefined reference to `PQfinish'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x46): undefined reference to `PQconnectdb'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x56): undefined reference to `PQstatus'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x66): undefined reference to `PQerrorMessage'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x8e): undefined reference to `PQfinish'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0xae): undefined reference to `PQexec'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0xbe): undefined reference to `PQresultStatus'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0xcf): undefined reference to `PQerrorMessage'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x10b): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x11f): undefined reference to `PQexec'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x12f): undefined reference to `PQresultStatus'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x140): undefined reference to `PQerrorMessage'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x17c): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x190): undefined reference to `PQexec'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x1a0): undefined reference to `PQresultStatus'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x1b1): undefined reference to `PQerrorMessage'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x1ed): undefined reference to `PQnfields'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x20f): undefined reference to `PQfname'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x26a): undefined reference to `PQgetvalue'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x2a6): undefined reference to `PQntuples'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x2b8): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x2cc): undefined reference to `PQexec'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x2dc): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x2f0): undefined reference to `PQexec'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x300): undefined reference to `PQclear'
C:\Users\Martin\AppData\Local\Temp\cclMue3l.o:test2.c:(.text+0x30c): undefined reference to `PQfinish'
collect2.exe: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 03 июня 2018

Здесь простая программа, которая помимо включения заголовочного файла также запрашивает таблицу test в схеме test , которая имеет два поля firstname и фамилия .Это гарантирует, что не только включаемый файл будет найден, но и компоновщик найдет дополнительные библиотеки:

Простая тестовая программа

#include <libpq-fe.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int lib_ver = PQlibVersion();
    printf("PQlibVersion: %d\n", lib_ver);

    PGconn *conn = PQconnectdb("user=stephan password=mypwd dbname=postgres");
    if (PQstatus(conn) == CONNECTION_BAD) {        
        fprintf(stderr, "Can't connect to Postgres: %s\n", PQerrorMessage(conn));
        PQfinish(conn);
        exit(-1);
    }

    PGresult *res = PQexec(conn, "SELECT * FROM test.test");    
    if (PQresultStatus(res) == PGRES_TUPLES_OK) {
        printf("\n     %-10s %-10s\n", PQfname(res, 0), PQfname(res, 1));
        printf("-------------------------\n");
        int rows = PQntuples(res);    
        for(int i=0; i<rows; i++) {       
            printf("[%d]: %-10s %-10s\n", i, PQgetvalue(res, i, 0), PQgetvalue(res, i, 1));
        }   
    }       
    PQclear(res);
    PQfinish(conn);
    return 0;
}

Build

Это можно построить с помощью следующей командной строки:

gcc -Wall -Wextra -I "C:\PostgreSQL\pg10\include" -L "C:\PostgreSQL\pg10\lib" query.c -lpq -o query

Вывод тестового прогона

output of test run

Объяснение аргументов компилятора

+--------------+----------------------------------------------------------------------+
|    argumet   |                meaning                                               |
+--------------+----------------------------------------------------------------------+
|   -Wall      |  switches on many warnigs                                            |
|   -Wextra    |  switches on additional warnings like unused parameters              |
|   -I _xxx_   |  searches for additional include files in the directory _xxx_                   |
|   -L _yyy_   |  looks in directory _yyy_ for additional libraries                   |
|   -l_zz_     |  links library _zz_                                                  |
|   -o _name_  |  the resulting program is called _name_.exe instead of a.exe         |
+--------------+----------------------------------------------------------------------+

Порядок библиотек

Порядок важен при связывании с библиотеками.Чтобы избежать ошибок undefined reference , аргумент -lpq должен идти после исходных файлов .c.

Как найти каталоги include и lib?

Следующие команды выводят каталог include и lib для Postgres:

pg_config --includedir
pg_config --libdir

В качестве альтернативы используйте Window File Explorer, перейдите в каталог установки Postgres и найдите include и lib каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...