windows - Tilslut Postgresql i C

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at forbinde et C-script, der kører på Windows til min Postgresql-database.


For øjeblikket fik jeg dette script på en hjemmeside:


#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.
", rec\_count);
        puts("==========================");

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

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

        PQclear(res);

        PQfinish(conn);

        return 0;
}


Jeg kopierede libpq-fe.h, postgres\_ext.c og pg\_config\_ext.c for at undgå fejlene.


og nu har jeg alle disse fejl:



  • Udefineret henvisning til 'PQconnectdb'

  • Udefineret henvisning til 'PQresultStatus'

  • ...



Så selvfølgelig har jeg ikke filen.c, som indeholder alle de funktioner, jeg har brug for, men jeg kan ikke finde den.


Jeg så på et andet forum, jeg skal oprette en makefile for at fortælle kompilatoren at bruge libpq.dll (jeg har denne fil), men jeg har ikke kendskab til det.


Hvordan kan jeg få det til at fungere?


EDIT


Så nu når jeg forsøger at kompilere det sådan:


gcc -I "C:Program FilesPostgreSQL9.6include" -L "C:Program FilesPostgreSQL9.6lib" test.c -lpq


Og jeg får fejlen:


C:Program FilesPostgreSQL9.6lib/libpq.dll: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status


Jeg synes det er tæt på den endelige løsning.


Fra den forskning, jeg lavede fandt jeg, at libpq.dll er 32bit, men mit miljø er 64bit. Gør denne forandring noget?


EDIT 2


Samlingen fungerer nu korrekt med denne linje:


gcc -m64 -I "C:Program FilesPostgreSQL9.6include" -L "C:Program FilesPostgreSQL9.6lib" test.c -lpq -o test.exe


Men når jeg dobbeltklikker på .exe har jeg følgende fejl:


'Kan ikke starte programmet, fordi LIBPQ.dll mangler'


Så det betyder helt klart, at jeg skal forbinde libpq.dll med sandsynligvis et link til Program Files/PG/9.6/lib.


Problemet her er, at jeg vil opbygge en selvstændig .exe, som sandsynligvis indlejrer Postgresql lib til at fungere korrekt, selvom computermål haven 't Postgresql er installeret på den


(Dette er muligt, for eksempel i Java, når vi bygger en krukke med alle de eksterne lib kopieret)


Er det muligt i C? Jeg tror, ​​jeg skal tilpasse min kompileringslinje, men jeg har ikke fundet, hvilken parameter jeg kan tilføje for at importere alle de nødvendige lib i .exe

Bedste reference


Fra dine redigeringer ser jeg, at du har fundet ud af, hvordan du bruger -I og -L mulighederne for gcc nu. Godt.


Jeg tror, ​​at dit relaining problem er, at du forsøger at forbinde med en 64-bit libpq.dll i 32-bit-tilstand eller omvendt.


Du kan indstille tilstanden med indstillingerne gcc -m32 og -m64.


Du kan undersøge det delte bibliotek med file libpq.dll, der skal fortælle dig, om det er et 32-bit eller et 64-bit bibliotek.


Hvis gcc fortæller dig noget som: 64-bit mode ikke kompileret i , skal du installere en passende version af gcc.


For at løse problemet, at libpq.dll ikke findes i løbetid, skal du enten placere den mappe, hvor den ligger i PATH miljøvariablen eller bruge indstillingen -Wl,-rpath,<directory with libpq.dll>.