在C中连接Postgresql

在C中连接Postgresql,c,windows,postgresql,C,Windows,Postgresql,我正在尝试将运行在Windows上的C脚本连接到我的Postgresql数据库 目前,我在一个网站上看到了这个脚本: #include <stdio.h> #include "libpq-fe.h" #include <string> #include <stdlib.h> int main() { PGconn *conn; PGresult *res; int rec_count; int

我正在尝试将运行在Windows上的C脚本连接到我的Postgresql数据库

目前,我在一个网站上看到了这个脚本:

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

int     main() {
PGconn          *conn;
PGresult        *res;
int             rec_count;
int             row;
int             col;



        conn = PQconnectdb("dbname=ljdata host=localhost user=dataman password=supersecret");

        if (PQstatus(conn) == CONNECTION_BAD) {
                puts("We were unable to connect to the database");
                exit(0);
        }

        res = PQexec(conn,
                "update people set phonenumber=\'5055559999\' where id=3");

        res = PQexec(conn,
                "select lastname,firstname,phonenumber from people order by id");

        if (PQresultStatus(res) != PGRES_TUPLES_OK) {
                puts("We did not get any data!");
                exit(0);
        }

        rec_count = PQntuples(res);

        printf("We received %d records.\n", rec_count);
        puts("==========================");

        for (row=0; row<rec_count; row++) {
                for (col=0; col<3; col++) {
                        printf("%s\t", PQgetvalue(res, row, col));
                }
                puts("");
        }

        puts("==========================");

        PQclear(res);

        PQfinish(conn);

        return 0;
}
我得到了一个错误:

C:\Program Files\PostgreSQL\9.6\lib/libpq.dll: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
我认为这接近最终解决方案

根据我的研究,我发现libpq.dll是32位的,而我的环境是64位的。这会改变什么吗

编辑2

编译现在可以正确地使用以下行:

gcc -m64 -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" test.c -lpq -o test.exe
但当我双击.exe时,出现以下错误:

无法启动程序,因为缺少LIBPQ.dll

因此,这显然意味着我必须将libpq.dll与程序文件/PG/9.6/lib链接起来

这里的问题是,我想构建一个独立的.exe,它可能嵌入Postgresql库,即使计算机目标上没有安装Postgresql,也能正常工作

这是可能的,例如在Java中,当我们构建一个Jar时,所有外部库都被复制到Jar中


在C语言中可能吗?我想我需要修改我的编译行,但是我没有找到可以添加哪个参数来导入.exe中所有需要的库,从您的编辑中我看到您现在已经知道了如何使用gcc的-I和-L选项。好

我猜您的问题在于您试图以32位模式链接64位libpq.dll,反之亦然

您可以使用gcc选项-m32和-m64设置模式

您可以使用文件libpq.dll检查共享库,该文件将告诉您它是32位库还是64位库

如果gcc告诉您:64位模式未编译,则需要安装适当版本的gcc


要解决在运行时找不到libpq.dll的问题,请将其所在的目录放入PATH环境变量中,或使用选项-Wl,-rpath,。

您不需要C文件,只需在链接器中包含Postgres库,如下所示:-lpq。因为我在Windows上,所以必须使用mingw编译它。当我键入g++-lpq test.c时,我得到以下错误:找不到-lpqSee这个问题:您是否也在编译那些.c文件?如果您使用的是gcc,例如gcc main.c postgres_ext.c pg_config_ext.c-o ouput抱歉,我犯了一个错误,这些文件都是header.hYes,这就是问题所在!我安装了MinGW-w64,现在编译效果很好。谢谢!我在执行过程中遇到了另一个问题,我认为这也与编译有关。如果你能回答的话,我编辑了我的第一篇文章。谢谢嗯,你应该回答另一个问题,或者实际运行网络搜索,因为这是一个日常问题。我已经修改了答案。我进行了一次网络搜索,但没有找到我想要的东西。无论如何,谢谢你的回答,但它似乎并没有真正解决我的问题,因为我正在寻找一种方法来构建一个独立的.exe,旁边没有任何目录。但别担心,我会写一个新问题。谢谢
gcc -m64 -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" test.c -lpq -o test.exe