2016-07-24 31 views
-1

Also ich versuche, meine eigene Bibliothek in C++ zu erstellen und in einem anderen Projekt zu verwenden. Bis jetzt funktioniert es mit Beispielcode, aber ich muss andere Bibliotheken in meiner eigenen Bibliothek einschließen. Also das Problem ist, dass, wenn ich die Header-Dateien aus meiner Bibliothek, die Include-Pfade in den Header-Dateien sind durcheinander gebracht. Eine einfache Lösung wäre, die Suchverzeichnisse hinzuzufügen, aber ich denke nicht, das ist, wie es soll gelöst werden.C++ Bibliothek mit verschachtelten Includes

Beispielcode - Bibliothek Header-Datei:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
int test(); 

Die Quelldatei:

#include "sample.h" 
int test() { return 20; } 

nun das Projekt, in dem ich die Probe

#include <sample.h> 
int main() { int a = test(); } 

Das Problem enthalten sein sollen ist , dass das Include den Code von sample.h direkt in die main.cpp und die Suchverzeichnisse für das ot kopiert sie schließt aus sample.h nicht mehr definiert

Antwort

0

Eine einfache Lösung wäre es, die Suchverzeichnisse hinzufügen, aber ich glaube nicht, das ist, wie seine angeblich gelöst werden.

Dies ist sicherlich die einfachste Lösung, da es keine Änderungen am Code erforderlich ist, und ist in der Regel eine akzeptable Sache zu tun - aber offenbar bedeutet, dass es das Projekt die Funktionen von glew.h anrufen und glfw3.h


Die einzige Alternative besteht darin, sicherzustellen, dass die Header nicht vom Header der Bibliothek, sondern von der Quelle enthalten sind.

IE:

Bibliothek Rubrik:

int test(); 

Bibliothek Quelle:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include "sample.h" 
int test() { return 20; } 

Und die Quelldatei des Projekts unverändert gelassen.

Dies erfordert, dass die in glew.h und glfw3.h definierten Typen nicht Teil der öffentlichen Schnittstelle sind, die von Ihrer Bibliothek bereitgestellt wird.

ZB wenn Ihre Bibliothek eine Funktion wie gehabt:

GLFWwindow* window = openWindow(...); 

Sie müssten es ändern:

Bibliothek Header:

struct WindowHandle; 
WindowHandle* openWindow(...); 

Bibliothek Quelle:

struct WindowHandle{ 
    GLFWwindow* window; 
}; 

WindowHandle* openWindow(...){ 
    WindowHandle* result; 
    //... do stuff... 
    result->window = //whatever; 
    return result; 
} 

Diese Approac h erfordert das Ändern des Bibliothekscodes, hat aber den Vorteil, dass die Benutzer der Bibliothek nicht direkt die Dinge aufrufen können, von denen die Bibliothek abhängt (glew und glfw in diesem Fall).Dies ist besonders vorteilhaft, wenn Sie mehrere Plattformen unterstützen möchten, eine Quelldatei zum Öffnen von Fenstern über glfw und eine andere mit direktem x. Die öffentliche Schnittstelle der Bibliothek müsste nicht geändert werden, um beide Backends zu unterstützen.

Wenn Sie mehr über diesen Ansatz erfahren wollen versuchen, für „Opaque Datentypen“ gesucht

+0

Wow Dank, das ist genau das, was ich suchte. Nur noch eine Sache: Wenn ich ein Projekt anlege, das mit meiner engine-Bibliothek verlinkt, muss ich auch mit allen anderen Bibliotheken verlinken (glew32d, opengl32 etc.). Gibt es eine Lösung, wo diese automatisch verknüpft werden? –

+0

Hmm, gute Frage. Ich hatte das selbe Problem selbst und verbinde mich einfach mit den Abhängigkeiten. Im Fall von etwas Open Source wie glew könnte man einfach seine Quelle in die Bibliothek aufnehmen und das Ganze in eins zusammenbauen (obwohl das gegen ihre Lizenz sein könnte, habe ich nicht überprüft). Das ist für opengl32 nicht möglich, da die Quelle nicht verfügbar ist. Vielleicht werfen Sie einen Blick auf http://stackoverflow.com/questions/5445023/c-can-you-build-one-static-library-intoan-other - obwohl der allgemeine Konsens da drüben scheint, gegen die Abhängigkeiten zu verlinken Gut. – jtedit