在C中连接Postgresql
我正在尝试将在Windows上运行的C脚本连接到Postgresql数据库。
目前,我在网站上获得了这个脚本:
#include #include "libpq-fe.h" #include #include 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; }
我复制了libpq-fe.h,postgres_ext.c和pg_config_ext.c以避免错误。
现在我有这些错误:
- 对’PQconnectdb’的未定义引用
- 对’PQresultStatus’的未定义引用
- …
显然我没有file.c,它包含我需要的所有function,但我找不到它。
我在另一个论坛上看到我需要创建一个makefile来告诉编译器使用libpq.dll(我有这个文件),但我不知道这样做。
我怎样才能使这个工作?
编辑
所以现在当我尝试编译它时:
gcc -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" test.c -lpq
我收到错误:
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可能链接到Program Files / PG / 9.6 / lib。
这里的问题是我想构建一个独立的.exe,它可能嵌入Postgresql lib以正常工作,即使计算机目标没有安装Postgresql也是如此
(这是可能的,例如在我们构建一个包含所有外部lib的Jar的Java中)
在C中有可能吗? 我想我需要调整我的编译行但是我没有找到我可以添加哪个参数来导入.exe中所有需要的lib
根据您的编辑,我发现您已经知道如何使用gcc
的-I
和-L
选项。 好。
我想您的关联问题是您尝试在32位模式下与64位libpq.dll
链接,反之亦然。
您可以使用gcc
选项-m32
和-m64
设置模式。
您可以使用file libpq.dll
检查共享库,该file libpq.dll
应该告诉您它是32位还是64位库。
如果gcc
告诉你类似的东西: 64位模式没有编译 ,你需要安装适当版本的gcc
。
要解决在运行时未找到libpq.dll
的问题,请将其所在的目录放入PATH
环境变量,或使用选项-Wl,-rpath,
。