Frage

Ich versuche, ein Programm und seine Plugin von benutzerdefinierten Makefiles zu CMake, mit minimalen Änderungen an den Code zu konvertieren.

Sowohl das Plugin und die App teilen einige Code; #ifdef ... #else ... #endif Blöcke verwendet werden, wo es Unterschiede gibt, und ich bin sicher, dass der Code mit der richtigen definiert kompiliert wird. Der Shared-Code enthält eine Klasse namens ToolImage. Wenn der Code für die App erstellt wird, verwendet der ToolImage Konstruktor einen anderen Ressourcenpfad als wenn es für das Plugin kompiliert wird.

#ifdef THE_APP
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (wxGetApp().GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#else
 ToolImage::ToolImage(const wxString& name, bool full_path_given):wxImage(full_path_given?name:
 (theApp.GetResFolder() + _T("/bitmaps/") + name + _T(".png")), wxBITMAP_TYPE_PNG)
#endif
{
 ...
}

Wenn das Programm und seine Plugin haben mit dem benutzerdefinierten Makefiles erstellt worden ist, funktioniert alles wie erwartet. Wann haben beide mit CMake zusammengestellt wurden, eine Reihe von Dateien mit CMakeLists.txt ich erstellt, gibt es ein Problem: das Plugin nicht in der Lage ist, die Bitmaps für die Symbolleiste zu laden.

raupen ich das Problem der ToolImage Klasse. Die Zeilennummer von GDB gegeben sagt mir, dass das Plugin den falschen Konstruktor verwendet. strace sagt mir die gleiche Sache (das Plugin ist für seine Bitmaps sucht eher in der Ressource dir der App als in der Ressource-Verzeichnis der Plug-In). Um sicherzustellen, dass ich nicht die definiert hatte es vermasselt, habe ich eine #error in ToolImage.cpp, innerhalb des Teils des #ifdef, die nur für die App erstellt werden soll - und das Plugin noch ohne Fehler kompiliert. Das sagt mir, dass das Plugin mit dem richtigen Code kompiliert. Da es den falschen Weg verwendet, halte ich es für die Klasse und Konstruktor in das Programm statt seiner eigenen kompiliert werden.

Wie stelle ich sicher, dass das Plugin seine eigene ToolImage-Klasse verwendet, die statt der in der App ?! Ich das Projekt nicht besitzen und nicht will, dass massive Veränderungen nur machen, mit einem anderen Build-System zu unterstützen, zu bauen.

die Precompilers Verwendung von zwei Versionen einer Klasse zu erstellen, scheint wie eine schlechte Wahl für mich. Wenn ich Änderungen am Code vornehmen müssen, tun Sie Vorschläge für dieses Problem zu umgehen haben?

War es hilfreich?

Lösung 2

Ich reparierte diese durch den Linker-Flag Hinzufügen -Wl, -Bsymbolic-Funktionen in der CMakeLists.txt:

set_target_properties( heekscnc PROPERTIES LINK_FLAGS -Wl,-Bsymbolic-functions )

Andere Tipps

Aus Gründen der Versuch, würde ich hinzufügen -fvisibility = ausgeblendet, wenn theApp Gebäude, auf alle oder vielleicht auf einige spezifische Quellen. Dies sollte Anwendung ToolImage vom Plugin verbergen.

Es ist nicht eine universelle Methode, wie sie in vielen Fällen Plugins verwenden unterschiedliche Symbole aus dem Hauptprogramm zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top