Programme avec Postgresql
chaps31
Membre
Bonjour à tous,
Voilà plusieurs fois que je tente sans succès de réaliser un programme utilisant Postgresql. Je dois en être à ma 3 ou 4eme tentative, cette fois c'est la bonne... Ayant pas toujours beaucoup de temps disponible j'ai laché l'affaire la dernière fois à cause de la difficulté à utiliser Xcode et Postgresql.
Postgresql m'est indispensable car je veux une base de données multi-utilisateurs et gratuite... Je n'en connais pas d'autres. Mon projet sera d'abord pour un usage personnel mais il est toujours possible qu'un jour je le vende.
Donc je commence mon projet, installe Postgresql. Déjà première surprise Xcode sait où trouver libpq, puisque je n'ai aucune erreur si je fais un include... Je veux faire un premier test, est-ce qu'Xcode trouve bien la bibliothèque C libpq pour que j'utilise les fonctions C d'accès aux bases de données ?
Premier problème j'ai dû sélectionner LLVM GCC 4.2 sinon...
J'ai trouvé la solution sur le net, mais je ne sais absolument pas ce qu'est ce machin qui a l'air fragile /wink.png' class='bbc_emoticon' alt=';)' /> ... bref, je suis totalement amateur, aucune formation en informatique mais j'ai pas mal programmé en PHP et je suis bien dégrossi en Objective-C même si je souffre du syndrome amateur : il manque des bases...
Bref je n'ai plus l'erreur sus-cité en mettant LVM GCC 4.2 mais je suis preneur de l'explication...
Autre bug surprenant, Xcode crée tout seul un AppDelegate dans lequel il crée un @property (assign) IBOutlet NSWindow *window; mais sans créer la variable d'instance !!! Bug... je la crée et c'est bon, mais je subodore qu'un truc m'échappe non ?
Enfin je teste pour voir si je peux facilement accéder aux fonction C :
.h
C'est juste un test j'aurais pu virer la variable d'instance pour l'instant.
.m
Et là misère : Undefined symbols for architecture i386: "_PQconnectdb", referenced from:
XCode ignore la bibliothèque C...
Il existe un framework "PGSQLKit" créé pour uiliser libpq avec XCode mais je voudrais éviter de dépendre d'un framework que je n'ai pas fait, sans compter les droits... Chose très étrange, si j'ajoute ce Framework à mon projet mais sans l'utiliser, juste ajouté je n'ai plus le bug !!! mon code précédent run sans erreur !!!
Je ne comprend pas ce qu'il se passe... Habitué à certaine lecture sur le net je précise que je ne sais pas ce qu'est un "flag"...
Je vous remercie beaucoup d'accepter de m'aider, car si j'arrive enfin à utiliser libpq avec Xcode je suis sauvé !!! SOS
Voilà plusieurs fois que je tente sans succès de réaliser un programme utilisant Postgresql. Je dois en être à ma 3 ou 4eme tentative, cette fois c'est la bonne... Ayant pas toujours beaucoup de temps disponible j'ai laché l'affaire la dernière fois à cause de la difficulté à utiliser Xcode et Postgresql.
Postgresql m'est indispensable car je veux une base de données multi-utilisateurs et gratuite... Je n'en connais pas d'autres. Mon projet sera d'abord pour un usage personnel mais il est toujours possible qu'un jour je le vende.
Donc je commence mon projet, installe Postgresql. Déjà première surprise Xcode sait où trouver libpq, puisque je n'ai aucune erreur si je fais un include... Je veux faire un premier test, est-ce qu'Xcode trouve bien la bibliothèque C libpq pour que j'utilise les fonctions C d'accès aux bases de données ?
Premier problème j'ai dû sélectionner LLVM GCC 4.2 sinon...
<br />
error: -fobjc-arc is not supported with fragile abi<br />
J'ai trouvé la solution sur le net, mais je ne sais absolument pas ce qu'est ce machin qui a l'air fragile /wink.png' class='bbc_emoticon' alt=';)' /> ... bref, je suis totalement amateur, aucune formation en informatique mais j'ai pas mal programmé en PHP et je suis bien dégrossi en Objective-C même si je souffre du syndrome amateur : il manque des bases...
Bref je n'ai plus l'erreur sus-cité en mettant LVM GCC 4.2 mais je suis preneur de l'explication...
Autre bug surprenant, Xcode crée tout seul un AppDelegate dans lequel il crée un @property (assign) IBOutlet NSWindow *window; mais sans créer la variable d'instance !!! Bug... je la crée et c'est bon, mais je subodore qu'un truc m'échappe non ?
Enfin je teste pour voir si je peux facilement accéder aux fonction C :
.h
<br />
#import <Foundation/Foundation.h><br />
#include "libpq-fe.h"<br />
<br />
@interface GVMaclasse : NSObject {<br />
<br />
NSString *nom;<br />
}<br />
@property (assign) NSString *nom;<br />
- (void) connect;<br />
@end<br />
C'est juste un test j'aurais pu virer la variable d'instance pour l'instant.
.m
<br />
#import "GVMaclasse.h"<br />
@implementation GVMaclasse<br />
@synthesize nom;<br />
- (void) connect<br />
{<br />
const char *conninfo;<br />
PGconn *conn;<br />
<br />
conninfo = "dbname = postgres";<br />
conn = PQconnectdb(conninfo);<br />
}<br />
@end<br />
Et là misère : Undefined symbols for architecture i386: "_PQconnectdb", referenced from:
XCode ignore la bibliothèque C...
Il existe un framework "PGSQLKit" créé pour uiliser libpq avec XCode mais je voudrais éviter de dépendre d'un framework que je n'ai pas fait, sans compter les droits... Chose très étrange, si j'ajoute ce Framework à mon projet mais sans l'utiliser, juste ajouté je n'ai plus le bug !!! mon code précédent run sans erreur !!!
Je ne comprend pas ce qu'il se passe... Habitué à certaine lecture sur le net je précise que je ne sais pas ce qu'est un "flag"...
Je vous remercie beaucoup d'accepter de m'aider, car si j'arrive enfin à utiliser libpq avec Xcode je suis sauvé !!! SOS
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Sinon pour ta dernière erreur, tu as indiqué le chemin de ta lin dans search path (Build Setting Panel) ?
Je suppose que tu compiles en 32 bits... Par défaut, Xcode 4 génère des projets 64 bits qui utilisent ARC. Hors ARC n'est pas disponible pour les applications 32 bits.
Normal, la variable d'instance n'est plus nécessaire quand on compile en 64 bits (ou pour iOS), le compilateur est capable de la créer tout seul.
Tu as bien rajouté le fichier ".a" (ou .dylib) explicitement au projet pour que le linker sache qu'il doit linker avec la librairie ? Parce qu'il ne la trouvera jamais tout seul. Que le compilateur trouve le .h tout seul quand il est inclus est une chose (du moment où il est dans /usr/include ou /usr/local/include c'est normal), mais il ne devinera jamais qu'il doit linker avec une librairie supplémentaire.
Bigre, bigre... Je sors ma paire de rames et ce qui est fou c'est que si j'ajoute le framework au projet sans l'utiliser tout marche !!! C'est incompréhensible... Je suis preneur de toute idée...
Sinon pourquoi avec LLVM GCC 4.2 je n'ai plus l'erreur lié à l'ARC ?
J'ai l'impression qu'il va falloir que je potasse comment fonctionne une librairie... .a...
Tout simplement parce que LLVM GCC ne supporte pas ARC, et qu'il est donc désactivé. Pour utiliser ARC, il faut obligatoirement compiler avec Clang.
[[NSApp delegate] maMethode];
Ben tu initialises cette variable dans applicationDidFinishLaunching:
Maintenant encore mieux: tu te crées un PostgresqlManager en singleton dans lequel tu pourras y ajouter toutes les méthodes nécessaires à la gestion de ta base.
Comme toi j'ai abandonné libpq, trop compliquée à utiliser au fil des différentes version de Xcode et Cocoa.
Pour ma part, chaque classe qui a besoin d'accéder aux bases a ses propres variables de connexion. Cela me semblait plus logique.
Oui, ça s'appelle un singleton. D'aucuns sur ce forum te diront que les méthodes de classes et les variables statics c'est pas bien, perso j'ai pas de problème avec ça.
L'avantage fonctionnelle du singleton est subtil, c'est plus facile à faire évoluer si en veut sous classer ce singleton, mais c'est très rare d'avoir besoin de la faire.
Mais surtout ne par perdre de vu que l'on ne peut gérer qu'une seule base de données pour tout le programme.
Perso, j'ai des classes managers pour gérer des BD, mais ce ne sont pas des singletons, une instance est crée pour chaque BD à gérer.