2016-09-07 2 views
-1

Ich programmiere gerade eine kleine Bibliothek mit abstrakten Klassen. Es ist eine Bibliothek, die einfache GUI-Erzeugungsklassen bietet, wie widget, main_window usw.Wie programmiert man eine austauschbare Bibliothek?

Mein Ziel ist es, eine Anwendung mit Schnittstellen und Factory-Funktionen zum Erstellen von tatsächlichen Objekten zu programmieren. Ich benutze cmake für mein Projekt (für Informationen aber nicht wirklich wichtig). Ich möchte in meine Lib die abstrakten Klassen (einfach) und die unterschiedliche Engine (wie qt5_engine, gtk_engine, ...) aufnehmen.

Der Client (meine Anwendung) mit der Lib kann nur die abstrakten Schnittstellen und Factory-Funktionen (Methoden, Lambdas, Builder-Klassen ??) sehen. Beim Erstellen der Lib wähle ich, welche Engine (nur eine) erstellt werden soll, um libmy_lib.so zu erhalten. Meine Anwendung wird libmy_lib.so verwenden, egal ob es mit meiner qt5_engine oder gtk_engine kompiliert wurde (statisch in my_lib für jede Engine verlinkt)

Damit kann ich endlich libmy_lib.so überschreiben, das mit einer anderen Engine kompiliert wurde GUI von meiner Anwendung verwendet. Aber ich mag auch einen sauberen Weg, um eine solche Lib mit einer anderen Engine zu implementieren, um einen sauberen Code zu erhalten, die "besten Praktiken" für die lib-Programmierung mit anderen Worten.

Ich habe irgendwie den Weg gefunden, es zu fragen, und so, die Art, es zu suchen> < Ich akzeptierte eine Antwort, die der Teil für die 'Änderung der lib-Datei ist, um die GUI zu ändern', aber wenn Sie Referenzen haben Bibliothek die saubere Art und Weise Codierung, die moderne Art, die awesome ...

Thx

+0

Haben Sie die Verknüpfung im Schritt "Neukompilieren" eingeschlossen? Sie können Ihren Code problemlos mit der gewünschten Bibliothek verknüpfen. –

+0

Sorry, meine Frage ist nicht richtig formuliert. Ich würde gerne wissen, ob es eine gute Möglichkeit gibt, die gleiche Schnittstelle zu einer Lib zu kodieren. Wie mit anderen Namespace für die lib und mit Namespace Alias, um die Anwendung zu zeigen, die Schnittstelle funktioniert, oder mit der gleichen Header-Datei, mit zwei verschiedenen Definitionsdateien (uh, dass man hässlich scheint) Geez bereits -2, rate mein Englisch nicht gut genug Stellen Sie Fragen, sorry :( –

+0

Nein, Ihr Englisch ist in Ordnung, es ist nur, dass die Frage unklar ist. Zuerst sagen Sie "ohne Neukompilierung", aber dann schlagen Sie vor, verschiedene Namespaces und Aliasnamen zu verwenden, was Sie tun * in der Quelle code * und das würde somit eine Neukompilierung erfordern –

Antwort

1

nachschlagen "ABI-Kompatibilität" wäre. Die Qt/KDE-Projekte haben eine gute Anleitung dazu:

https://wiki.qt.io/Qt-Version-Compatibility https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C++

Die extreme Version davon würde die „Sanduhr-Interface“ Muster sein, wobei die binäre Schnittstelle der Bibliothek reiner C ist, aber es gibt eine inlined C++ API darüber und eine C++ Implementierung unter:

https://www.youtube.com/watch?v=PVYdHDm0q6Y

EDIT: Ich wollte nur eine Klarstellung hinzuzufügen: Wo diese Führungen über die Kompatibilität zwischen den verschiedenen Versionen sprechen, würde Ihre Bibliotheken müssen sich an t Die gleichen Einschränkungen für verschiedene Backends.

Verwandte Themen