2010-11-22 7 views
4

Mon projet Qt est lié à une bibliothèque qui est uniquement linux. Lorsque le projet est exécuté sous Linux, je souhaite qu'un signal soit déclenché sur un événement en utilisant un type défini dans cette bibliothèque. Une complication que j'ai, cependant, est que le projet doit également construire dans Windows. Évidemment, ce signal et l'emplacement qui l'attrape n'existeraient pas dans Windows, et c'est bien. Je suis, cependant, trouver des problèmes avec l'outil moc de Qt ne parvenant pas à reconnaître l'existence d'un #ifdef __linux__ autour du code qui émet le signal. Mon code ressemble à ceci:Signal Qt enveloppé dans un ifdef

[SomeFile.h]

#ifdef __linux__ 
signals: 
    void SomeSignal(SomeTypeDefinedInTheLinuxLibrary); 
#endif 

[SomeFile.cpp]

#ifdef __linux__ 
    emit SomeSignal(someObject); 
#endif 

Lorsque je tente de compiler cela avec g ++, je reçois l'erreur: SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)

Des idées pour obtenir moc et #ifdefs pour bien jouer ensemble?

Répondre

5

Une solution beaucoup mieux est de toujours fournir le signal et de commenter le code qui le déclenche sur Windows. De cette façon, l'API publique est la même sur toutes les plateformes.

[EDIT] L'outil moc est vraiment bête. Il ne comprend pas réellement le code; Au lieu de cela, il réagit simplement sur certains modèles. C'est pourquoi il ignore le #ifdef. Pour résoudre le problème, enveloppez le type ou utilisez #ifndef __linux__ et définissez votre propre type de dummy pour qu'il compile sous Windows. Puisque le signal ne sera pas émis sur Windows, le slot ne sera jamais utilisé, donc tout type qui compile le code devrait être bon.

+0

J'aimerais pouvoir le faire, mais le type de paramètre associé au signal est défini par la bibliothèque spécifique à Linux. Si je devais essayer de construire sous Windows avec le signal non commenté, il serait erreur avec un type indéfini. –

+0

@Dave: Enveloppez le type ou utilisez '#ifndef __linux__' et définissez votre propre type factice pour qu'il soit compilé sous Windows. –

+0

Merci pour votre contribution. J'ai fini par emballer le type et l'ai mis au travail. Il semble toujours que le code généré par le moc doit respecter le #ifdefs dans lequel se trouve le code du signal/slot. –

0

Avec Qt 5.3 au moins en utilisant Visual Studio, je suis capable de passer des macros pré-processeur à l'outil moc. Afin de faire ce travail, j'ai dû éditer mon fichier de projet Visual Studio et ajouter manuellement des arguments de ligne de commande pour chaque fichier afin de transmettre les arguments du pré-processeur à l'outil moc. Vous pouvez utiliser -D [Pre-Processor], c'est-à-dire -DSPECIAL_BUILD ou -DSPECIAL_BUILD = 1, et le compilateur moc est assez intelligent pour voir les vérifications #if SPECIAL_BUILD dans votre code et ne pas essayer de copier ces parties.

Recherchez simplement "moc.exe" et ajoutez les paramètres appropriés pour chaque configuration.

Questions connexes