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