2010-11-22 11 views
4

Mein Qt-Projekt ist mit einer Bibliothek verbunden, die nur Linux verwendet. Wenn das Projekt unter Linux ausgeführt wird, möchte ich ein Signal für ein Ereignis auslösen, das einen in dieser Bibliothek definierten Typ verwendet. Eine Komplikation, die ich habe, ist, dass das Projekt auch in Windows bauen muss. Offensichtlich würden dieses Signal und der Slot, der es abfängt, in Windows nicht existieren, und das ist in Ordnung. Ich finde jedoch Probleme mit Qt Moc-Tool nicht erkennen, die Existenz eines #ifdef __linux__ um den Code, der das Signal ausgibt. Mein Code sieht wie folgt aus:Qt-Signal in einem ifdef eingepackt

[SomeFile.h]

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

[SomeFile.cpp]

#ifdef __linux__ 
    emit SomeSignal(someObject); 
#endif 

Wenn ich versuche, dies zu kompilieren mit g ++, erhalte ich die Fehlermeldung: SomeFile.cpp:(.text+0x858c): undefined reference to SomeFile::SomeSignal(SomeTypeDefinedInTheLinuxLibrary)

Irgendwelche Ideen, wie man moc und #ifdefs gut zusammen spielen kann?

Antwort

5

Eine viel bessere Lösung ist, immer das Signal zur Verfügung zu stellen und nur den Code auskommentieren, der es unter Windows feuert. Auf diese Weise ist die öffentliche API auf allen Plattformen gleich.

[Bearbeiten] Das Moc-Tool ist wirklich dumm. Es versteht den Code nicht wirklich. Stattdessen reagiert es nur auf bestimmte Muster. Deshalb ignoriert es die #ifdef.

Um das Problem zu lösen, wickeln Sie den Typ oder verwenden #ifndef __linux__ und definieren Sie Ihren eigenen Dummy-Typ dort, so dass es unter Windows kompiliert. Da das Signal unter Windows nicht ausgegeben wird, wird der Steckplatz niemals verwendet, daher sollte jeder Typ, der den Code kompiliert, in Ordnung sein.

+0

Ich wünschte, ich könnte das tun, aber der Typ des Parameters mit dem Signal verbunden ist durch die Linux-spezifische Bibliothek definiert. Wenn ich versuchen würde, unter Windows zu bauen, wobei das Signal nicht auskommentiert ist, würde es einen Fehler mit einem undefinierten Typ geben. –

+0

@Dave: Wickeln Sie den Typ oder verwenden Sie '#ifndef __linux__' und definieren Sie dort Ihren eigenen Dummy-Typ, damit er unter Windows kompiliert werden kann. –

+0

Danke für Ihre Eingabe. Ich endete damit, den Typ zu verpacken und es zur Arbeit zu bringen. Es scheint immer noch so, als ob der Code, der vom Moc erzeugt wird, die #ifdefs respektiert, in der der Signal/Slot-Code liegt. –

0

Mit Qt 5.3 zumindest mit Visual Studio kann ich Pre-Prozessor-Makros an das Moc-Tool übergeben. Damit dies funktioniert, musste ich meine Visual Studio-Projektdatei bearbeiten und manuell Befehlszeilenargumente für jede Datei hinzufügen, um die Präprozessorargumente an das Moc-Tool zu übergeben. Sie können -D [Pre-Processor], d. H. DSPECIAL_BUILD oder -DSPECIAL_BUILD = 1 verwenden, und der MoC-Compiler ist intelligent genug, um zu sehen, wie der Code in SPECIAL_BUILD Ihren Code überprüft und nicht versucht, diese Teile zu mocen.

Suchen Sie einfach nach "moc.exe" und fügen Sie für jede Konfiguration die entsprechenden Parameter hinzu.

Verwandte Themen