对“PQclear'”的未定义引用;编译简单';C';与Postgres 10通话的程序

对“PQclear'”的未定义引用;编译简单';C';与Postgres 10通话的程序,c,postgresql,C,Postgresql,在DebianLinux上编译和运行的简单C程序。我需要让它在Windows上运行,但在编译它时会得到以下信息。这似乎是一个常见的问题,但我还没有找到解决办法 如果我使用 #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 re

在DebianLinux上编译和运行的简单C程序。我需要让它在Windows上运行,但在编译它时会得到以下信息。这似乎是一个常见的问题,但我还没有找到解决办法

如果我使用

#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

这里有一个简单的程序,除了包含头文件外,它还查询模式测试中的表测试,该测试有两个字段firstname和lastname。这确保不仅找到了包含文件,而且链接器还找到了其他库:

简单测试程序

#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;
}
测试运行的输出

编译器参数的解释

+--------------+----------------------------------------------------------------------+
|    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         |
+--------------+----------------------------------------------------------------------+
图书馆的顺序

+--------------+----------------------------------------------------------------------+
|    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         |
+--------------+----------------------------------------------------------------------+
链接库时,顺序很重要。为避免未定义的引用错误,-lpq参数应位于.c源文件之后

如何查找include和lib目录?

以下命令正在打印Postgres的include和lib目录:

pg_config --includedir
pg_config --libdir

或者使用窗口文件资源管理器,导航到Postgres的安装目录,并搜索include和lib目录

这里有一个简单的程序,除了包含头文件外,它还查询模式测试中的表测试,该测试有两个字段firstname和lastname。这确保不仅找到了包含文件,而且链接器还找到了其他库:

简单测试程序

#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;
}
测试运行的输出

编译器参数的解释

+--------------+----------------------------------------------------------------------+
|    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         |
+--------------+----------------------------------------------------------------------+
图书馆的顺序

+--------------+----------------------------------------------------------------------+
|    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         |
+--------------+----------------------------------------------------------------------+
链接库时,顺序很重要。为避免未定义的引用错误,-lpq参数应位于.c源文件之后

如何查找include和lib目录?

以下命令正在打印Postgres的include和lib目录:

pg_config --includedir
pg_config --libdir

或者使用窗口文件资源管理器,导航到Postgres的安装目录,并搜索include和lib目录

这是你第一次尝试使用图书馆吗?你到底是如何建立的?请显示等效的命令行或makefile?是的,第一次(事实上,这是我第一次在windows中使用C!)-而且我不是C程序员。。。。cmdline命令在我的原始帖子中。您如何构建?你使用编译器吗?你使用IDE吗?告诉我们在编写程序文本和运行可执行文件之间要做什么。您是否成功编译并运行了“HelloWorld”?所有这些看起来都很正常。您需要-I选项来指示include在哪里,-L表示libpq库所在的位置,以及-lpq指示链接libpq。顺便说一句,Debian Linux也是如此。这是你第一次尝试使用库吗?你到底是如何构建的?请显示等效的命令行或makefile?是的,第一次(事实上,这是我第一次在windows中使用C!)-而且我不是C程序员。。。。cmdline命令在我的原始帖子中。您如何构建?你使用编译器吗?你使用IDE吗?告诉我们在编写程序文本和运行可执行文件之间要做什么。您是否成功编译并运行了“HelloWorld”?所有这些看起来都很正常。您需要-I选项来指示include在哪里,-L表示libpq库所在的位置,以及-lpq指示链接libpq。顺便说一句,DebianLinux也是如此。看起来很有希望,但我现在得到了(请注意正斜杠)-在那里;我发现一些非常古老的线索提到了它,但没有答案。我以为是我把linux和windows搞混了。。。C:\Program Files\PostgreSQL\10\lib/libpq.dll:文件未识别:文件格式未识别collect2.exe:错误:ld返回1个退出状态我没有说我正在使用MinGW(我能找到的安装GCC的最简单方法)无法识别的文件格式可能表示gcc/Postgres/Windows版本之间存在32位/64位不匹配。这是真的吗?我想这只是前进的斜线,而不是路径中的反斜线。但我可能错了!。我经常在主要在*NIX系统上开发的软件中看到,诊断输出常常混合了反斜杠和正斜杠。因此,这大概不是问题所在。还发现:这里有人有一个32位的Windows和一个64位版本的Postgres,带有与您遇到的相同的错误消息。所以可能值得一看。看起来很有希望,但我现在得到了(注意正斜杠)-那里;我发现一些非常古老的线索提到了它,但没有答案。我以为是我把linux和windows搞混了。。。C:\Program Files\PostgreSQL\10\lib/libpq.dll:文件未识别:文件格式未识别collect2.exe:错误:ld返回1个退出状态我没有说我正在使用MinGW(我能找到的安装GCC的最简单方法)无法识别的文件格式可能表示gcc/Postgres/Windows版本之间存在32位/64位不匹配。这是真的吗?我想这只是前进的斜线,而不是路径中的反斜线。但我可能错了!。我经常在主要在*NIX系统上开发的软件中看到,诊断输出常常混合了反斜杠和正斜杠。因此,这大概不是问题所在。还发现:这里有人有一个32位的Windows和一个64位版本的Postgres,带有与您遇到的相同的错误消息。所以可能值得检查一下。