2009-09-02 8 views
0

En utilisant MSYS, j'ai compilé libpq (à partir de postgres de compilation). J'ai ensuite compilé libpqxx. Maintenant, je veux créer un client qui utilisera libpqxx. libpq semblait fonctionner correctement. Et, je peux compiler du code avec libpqxx. Toutefois, la liaison de l'application client libpq échoue.Impossible de lier libpqxx dans MinGW

Voici mon code:


#include <pqxx/pqxx> 
#include <iostream> 
using namespace std; 
using namespace pqxx; 

int main() { 
    connection Conn("dbname=test"); 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    return 0; 
} 

J'ai ajouté un tas de libs sur le lien dans un vain espoir il soudainement travailler. Voici ce que j'ai jusqu'à présent:

 
g++ -IC:\msys\1.0\local\pgsql\include -IC:\msys\1.0\local\include -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Controller.o ..\src\Controller.cpp 
g++ -LC:\MinGW\lib -LC:\msys\1.0\local\pgsql\lib -LC:\msys\1.0\local\lib -oController.exe src\Controller.o -lws2_32 -lole32 -lpqxx -lpq -loleaut32 -luuid 
C:\msys\1.0\local\lib/libpqxx.a(connection_base.o): In function `ZN45_GLOBAL__N__ZN4pqxx16encrypt_passwordERKSsS1_7wait_fdEibP7timeval': 
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:1434: undefined reference to `[email protected]' 
C:\msys\1.0\local\lib/libpqxx.a(connection_base.o): In function `ZN4pqxx15connection_base12check_resultERKNS_6resultE': 
C:/msys/1.0/home/rsolomon/libpqxx/libpqxx-3.0.2/src/connection_base.cxx:420: undefined reference to `[email protected]' 
collect2: ld returned 1 exit status 
Build error occurred, build is stopped 
Time consumed: 1770 ms. 

Je pense le -lws2_32 aurait dû m'a donné le « select @ 20 ». Pourquoi l'éditeur de liens est-il si utile?

Répondre

2

Le lieur Unix traite traditionnellement les bibliothèques de gauche à droite. Donc, il considère d'abord ws2_32, trouve qu'il n'a pas beaucoup d'utilité, puis passe à pqxx, et voit que select est indéfini et n'est défini par aucune des bibliothèques ultérieures. IOW, essayez de déplacer ws2_32 à la fin de la ligne de commande.

+0

Wow! Ça a marché. Donc, l'ordre du -l devrait aller des bibliothèques spécifiques que j'utilise d'abord aux bibliothèques les plus transitives? Je suppose que j'ai trouvé ça à la dure. – User1

+0

Aurais-je jamais besoin d'un -l pour la même lib deux fois? – User1

+1

Unix utilise traditionnellement tsort (1) pour calculer l'ordre topologique, même s'il n'est pas largement utilisé ... Dans tous les cas, oui, vous devrez peut-être ajouter des bibliothèques deux fois s'il y a une dépendance cyclique entre bibliothèques - ce que vous ne devriez pas avoir si vos bibliothèques sont correctement empilées. –

Questions connexes