Bonjour à tous !
Je débute en C et je souhaite créer un .exe à partir d'un code C via le compilateur gcc.
Avant de réellement développer le code final, j'ai essayé de faire une version minimaliste pour les tests. Voici le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #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;
} |
Tout droit venu d'internet, je cherche d'abord à faire dire à la console quelque chose du genre "connexion impossible" etc.
Le but final est de créer un fichier executable sur Windows (un .exe) totalement autonome. J'entends par là qu'il suffira de télécharger le .exe, le mettre n'importe où, ne rien installer de plus pour qu'il fonctionne. Sauf que mon programme a besoin des librairies de PostgreSQL pour se connecter à ma base de donnée, et là ça coince.
Pour les connaisseurs, j'essaye de créer quelque chose de similaire à un jar dans lequel on a copié toutes les librairies externes dont le code dépend, le tout directement dans le jar.
Après pas mal de recherche, j'arrive à compiler mon .exe grâce à cette commande :
gcc -m64 -I "C:\Program Files\PostgreSQL\9.6\include" -L "C:\Program Files\PostgreSQL\9.6\lib" test.c -lpq -o test.exe
Qui, en gros, dit à gcc d'utiliser le compilateur 64 bits, d'inclure le dossier "include" de Postgresql et les librairies contenues dans le dossier lib. Ensuite vient l'option -l<lib> (ici -lpq) sensé aller chercher le fichier libpq (si j'ai bien tout compris)
Bref me voilà avec un .exe tout beau tout neuf, mais dès que je double clique dessus (comme un utilisateur lambda) une erreur apparaît :

Après quelques recherches, la fonction "-static" de gcc semble être la solution que je recherche, mais je n'arrive pas à m'en servir (Si jamais quelqu'un sait comment s'en servir et sait l'expliquer simplement je suis preneur
).
Sur un forum, on m'a dit de rajouter :
-Wl,-rpath,"C:\Program Files\PostgreSQL\9.6\lib"
La compilation se déroule sans accroc, mais toujours la même erreur à l'exécution.
Comme je débute dans le C il est possible que je n'ai pas bien compris le fonctionnement et que je fasse quelque chose de travers. Voici donc en détail ce que j'ai fais jusque là :
- J'ai téléchargé et installé PostgreSQL pour Windows dans le dossier "C:\Program Files\PostgreSQL\9.6" et ça fonctionne. Je m'en sers entre autre en java et tout roule.
- Pour compiler en C, j'ai installé MinGW dans le dossier "C:\MinGW" puis j'ai ajouté le dossier bin de ce dernier dans ma variable PATH afin de pouvoir me servir de la commande de compilation "gcc"
- J'ai vérifié, le libpq.dll est bien sur mon pc dans le dossier lib de Postgresql
- Enfin j'ai créé le test.c contenant le code que je vous ai fourni. J'ai ouvert une console dans le dossier, et j'ai tapé la ligne de compilation fournie également.
Je redis donc que le but est vraiment un .exe tout seul et entièrement autonome, je ne peux donc pas rajouter de dossier dans ma variable PATH car mes clients n'auront ni PostgresSQL d'installé sur leur machine, et encore moins une quelconque variable PATH configurée.
Si possible, pourriez-vous m'expliquer ce que je fais de travers, et m'expliquer point par point comment je dois m'y prendre ?
Je vous remercie de votre attention.
Partager