Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 09/03/2012 14:18:46
- fredo
- Membre
Link error avec Visual C 2008 et libpq.li ou libecpg.lib
Bonjour,
nouveau dans l'univers PostgreSQL, j'ai installé PostgreSQL 9.1.3.1 sur mon win7 x64 (installateur One Click) et j'ai utilisé Stack Builder pour recharcher le Database Server 9.1.3.1 (mais retrospectivement, je pense que c'était inutile).
J'ai réussi à créer une base 'MYDB' et utiliser psql avec l'utilisateur 'postgres' et mot de passe 'password' pour créer des tables.
Néanmoins, lorsque je crée, sous Visual 2008, une application Win32 console TestDB.c utilisant la libpq (sans precompiled header et en mode langage C), j'obtiens les erreurs de link suivantes:
1>TestDB.obj : error LNK2019: unresolved external symbol _PQfinish referenced in function _wmain
1>TestDB.obj : error LNK2019: unresolved external symbol _PQconnectdb referenced in function _wmain
Mon code est:
#include <libpq-fe.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
const char *conninfo;
PGconn *conn;
conninfo = "dbname = 'MYDB' user = 'postgres' password = 'password'";
conn = PQconnectdb(conninfo);
PQfinish(conn);
return 0;
}
J'ai ajouté le répertoire include "C:\Program Files\PostgreSQL\9.1\include", ainsi que le répertoire lib "C:\Program Files\PostgreSQL\9.1\lib", et la libpq.lib à mon projet Visual.
La bibliothèque est bien trouvée par Visual (j'ai fait des tests en donnant un mauvais nom, et Visual me le dit). Le fichier include libpq-fe.h aussi car il n'y a pas d'erreur à la compilation.
J'ai également essayé de compiler le projet en mode C++, mais rien n'y fait. Je pense que j'ai du louper une étape. J'en viens à me demander si les bibliothèques fournies sont compatibles avec Visual 2008. Et je pense télécharger le code source de libpq et libecpg afin de les recompiler.
Si quelqu'un à une idée de ce qui se passe, je le remercie d'avance
Hors ligne
#2 09/03/2012 19:16:12
- gleu
- Administrateur
Re : Link error avec Visual C 2008 et libpq.li ou libecpg.lib
De souvenir, elles sont compatibles avec Visual C++ 2008, mais pas avec Visual C++ 2010.
pgadmin est un projet en C++ qui utilise la libpq et est codé sous Windows avec Visual C++ 2008. Essayez de voir comment est configuré le fichier .sln, cela vous donnera peut-être une idée.
Guillaume.
Hors ligne
#3 14/03/2012 13:08:32
- fredo
- Membre
Re : Link error avec Visual C 2008 et libpq.li ou libecpg.lib
Bonjour, merci pour la réponse.
J'ai téléchargé le source de pgadmin.
Cependant, au niveau utilisation de la libpq, n'ai pas trouvé à priori de différence.
La variable PGDIR pointe sur le répertoire d'installation de PostgreSQL.
PGDIR\include est utilisé comme chemin additionnel pour les fichier include et PGDIR\lib pour les libs. La libpq.lib est ajoutée comme input au link.
Donc exactement ce que je tente de faire.
Je n'ai pas essayé de compiler pgadmin car il y a trop de dépendances sur d'autres lib (wxwidgets entre autre).
Je suis en train de télécharger les sources de postgresql 9.1.3 afin de recompiler la libpq.lib par moi-même.
D'autre part, je vais tenter d'installer une version différente de postgresql 9.0 pour vérifier si j'ai le même problème
En dernier ressort je posterai sur le forum anglais http://forums.enterprisedb.com.
Plus d'info dans une prochaine réponse !
Hors ligne
#4 14/03/2012 18:18:13
- fredo
- Membre
Re : Link error avec Visual C 2008 et libpq.li ou libecpg.lib
Bonjour,
j'ai réussi à recréer une libpq.lib fonctionnelle me permettant de linker et de faire marcher mon programme de test (et plus).
La marche à suivre est donnée ci-dessous (si ça peut servir à quelqu'un):
1 télécharger les source, et les extraire dans un répertoire R.
2 lire la doc sur la compilation des sources sous windows (paragraphe 16.1)
http://www.postgresql.org/docs/9.1/inte … -full.html
3 aller dans R/src/tools/msvc et lancer perl mkvcbuild.pl
4 aller dans R et lancer le fichier pgsql.vcproj, ce qui lance Visual 2008 (obligatoire) et demande une confirmation pour convertir tous les fichiers vcproj dans la nouvelle version (confirmer la conversion). L'ensemble des projets va apparaitre dans Visual 2008.
5 aller dans R/src/include et éditer pg_config.h afin de rajouter:
/* PostgreSQL major version as a string */
#define PG_MAJORVERSION "9.1"
(sinon, impossible de compiler la lib libpgport.lib, mais j'ai peut-être raté le configure, ou bien le fichier pg_config.h.win32 est incomplet)
6 sous Visual 2008, builder en séquence les libs: libpgport.lib et libpq.lib (il semblerait que la libpq.lib ait besoin de libpgport.lib)
7 recopier la libpq.lib générée dans le répertoire C:\Program Files\PostgreSQL\9.1\lib (conserver une copie de la libpq.lib initiale)
8 dans le projet utilisant la libpq, faire en sorte de ne plus utiliser la lib msvcrt en rajoutant 'msvcrt' dans 'Project Properties - Linker - Input - Ignore Specific Library'
et rajouter ws2_32.lib wsock32.lib secur32.lib dans 'Additional Dependencies', après libpq.lib
(ce qui ressemble à peu près à ce que j'ai vu dans le .vcproj de pgadmin)
Le link fonctionne dès lors.
J'ai enrichi le programme de test afin de réaliser les opérations de base sur mes tables avec succès.
Enfin, ce workaround n'explique pas le problème initial.
Si quelqu'un a une autre idée, je suis preneur.
Merci
Dernière modification par fredo (14/03/2012 18:21:48)
Hors ligne
#5 22/03/2012 16:25:06
- fredo
- Membre
Re : Link error avec Visual C 2008 et libpq.li ou libecpg.lib
Bonjour,
j'ai téléchargé plusieurs versions différentes de PostgreSQL x64, mais j'ai toujours obtenu le même problème.
Par contre l'installation d'une version x86 (32bits) m'a permis de linker et j'ai obtenu un exécutable fonctionnel.
Vu que je compile toujours mes applications en 32bit, le link ne pouvait pas fonctionner avec des libs 64bits (dommage qu'aucun message d'erreur explicite n'ait indiqué mon erreur !).
En conclusion: le One Click Installer 64bits est fourni avec le moteur 64bits et une lib front-end 64bits, tandis que le One Click Installer 32bits est fourni avec le moteur 32bits et une lib front-end 32bits (après coup ça semble évident !)
Après recherche, connaissant le problème exact, c'est expliqué là:
Hors ligne