【问题标题】:Execute C script needing ext lib执行需要 ext lib 的 C 脚本
【发布时间】:2017-03-29 17:33:15
【问题描述】:

参考Connect Postgresql in C

我请求一些帮助来编译我的 Postgres 数据库连接脚本。这现在编译得很好,但是现在我执行它时遇到了问题。

有代码:

#include <stdio.h>
#include "libpq-fe.h"
#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;
}

这是它实际工作的编译行:

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

但我要做的是在我计划分发的二进制 .exe 中编译来自 .c/.dll 等的所有方法,并且不会在目标机器上安装 postgresql 库。

经过一些网络搜索,我找到了“-static”参数,但我不确定它是否是我正在寻找的,并且我无法使用此参数对其进行编译。

然后我尝试添加“-static-libgcc”,结果为:

gcc -m64 -static-libgcc -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" test.c -lpq -o test.exe

但是当我尝试运行它时仍然出现“系统错误”:

“无法运行脚本,因为您的计算机上缺少 LIBPQ.dll” (不确定我的法语翻译是否准确)

你知道我可以将我的 C 程序编译成二进制 .exe 的参数或方式吗?它完全独立且无需任何库要求?

编辑

截图:

【问题讨论】:

    标签: c windows postgresql dll


    【解决方案1】:

    坚持使用动态链接。

    你的问题是系统在运行时找不到libpq.dll

    有两种解决方案:

    1. C:\Program Files\PostgreSQL\9.6\lib 添加到PATH 环境变量中。

    2. libpq.dll 的副本放在与您的可执行文件相同的路径中。

    【讨论】:

    • 因为我要部署我的exe,所以我选择了第二个选项。编译与这一行效果很好: [ gcc -m64 -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" -Wl,-rpath,"C :\Program Files\PostgreSQL\9.6\lib" test.c -lpq -o test.exe ]。但是当我双击可执行文件时,会出现一个 cmd 提示符,然后另一个窗口也会出现通常的错误。如果您能够理解法语或翻译错误,我编辑了我的第一篇文章以添加屏幕截图
    • 抱歉,我犯了一个错误(我不是 Windows 专家)。 Windows 没有运行路径的概念。我已经用一个替代建议解决了这个问题。现在我知道为什么在那个愚蠢的操作系统上通常会有这么多共享库的副本。
    • 谢谢。第二个解决方案仍然更好地部署我的应用程序。我想我不能只提供一个独立的.exe,旁边没有任何东西(例如.dll)。还是谢谢!
    • 听起来不错,但没有静态 libpq。您必须自己构建它,我不知道这是否有效,尤其是在 Windows 上。该文档没有提供任何内容,并且发送一份libpq.dll...
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多