gpt4 book ai didi

c - 对 `PQclear' 的 undefined reference 使用 Postgres 10 调用编译简单的 'C' 程序

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:12 26 4
gpt4 key购买 nike

在 Debian Linux 上编译和运行的简单 C 程序。我需要让它在 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

最佳答案

这里有一个简单的程序,除了包含头文件之外,它还查询模式 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;
}

构建

这可以通过以下命令行构建:

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目录?

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

pg_config --includedir
pg_config --libdir

或者使用 Window 文件资源管理器,导航到 Postgres 的安装目录并搜索 includelib 目录。

关于c - 对 `PQclear' 的 undefined reference 使用 Postgres 10 调用编译简单的 'C' 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com