2016-07-16 9 views
4

Stellen Sie sich vor Ich kompiliere (eine statische) Bibliothek libfoo.a, die eine Header-Datei foo.h bereitstellt. Ich werde meine Anwendung APP gegen libfoo.a und #include <foo.h> in meinem Quellcode verknüpfen. libfoo wird mit CMake als Build-System mit benutzerdefinierten Variablen, wie BUILD_WITH_OPTION_BAR, die auf die Definitionen an den Compiler übergeben werden:Wie verwende ich (eine Konfigurationsdatei für) externe Header-Dateien, die kompilierungszeitabhängige #defines enthalten?

ADD_DEFINITIONS(BUILD_WITH_OPTION_BAR)

Innen foo.h wir #ifdef Erklärungen mit dieser Option finden:

#ifdef BUILD_WITH_OPTION_BAR 
    typedef long long int fooInt; 
#else 
    typedef int fooInt; 
#endif 

Meine Frage ist: Wie soll ich in meinem APP wissen, dass libfoo.a mit oder ohne gebaut wurde t BUILD_WITH_OPTION_BAR?

Mit anderen Worten: Wo und wann muss ich BUILD_WITH_OPTION_BAR in meinem APP definieren?

Mein Grundverständnis ist, dass die Bibliothek libfoo sollte eine Art von config.h Datei zur Verfügung stellen, die innerhalb foo.h enthalten ist, aber, wie Sie ein optional#define BUILD_WITH_OPTION_BAR dort bei der Kompilierung bekommen (von libfoo)?

fand ich diese Frage im Zusammenhang: add_definitions vs. configure_file aber nicht nicht darüber diskutieren, wie dies tatsächlich erreicht wird.

+0

Müssen Sie wirklich wissen, mit was die Bibliothek gebaut wurde? Warum nicht einfach den 'fooInt' Typedef verwenden? Wenn es wirklich darauf ankommt, welches benutzt wird, dann sollte es vielleicht nicht in der Bibliothek sein? – smac89

+3

Ja, ich muss es wirklich wissen, denn wenn ich 'fooInt' verwende, was wird dann' typedef'? Es muss genauso sein wie in der verbundenen Bibliothek, oder? Und das funktioniert nur, wenn ich weiß, wo 'libfoo' erstellt wurde und' BUILD_WITH_OPTION_BAR' definiert ist (undefiniert). – Chris

+0

@ruslo danke, dass du eine gute Antwort gefunden hast - ich könnte vorschlagen, dass du diese Frage/Überschrift redigierst, um es einfacher für andere in der Zukunft zu finden – Chris

Antwort

1

Der Weg ist es, eine "config.h" Datei mit den Definitionen zu erstellen, anstatt sie als Befehlszeilenargumente an den Compiler zu übergeben. Sie können die Datei config.h mit der Bibliotheksdatei verteilen.

Cmake bietet einen Mechanismus zum Generieren einer solchen Datei.

CONFIGURE_FILE(<src filename>, <dest filename>) 

Typischerweise wird die Quelldatei „config.h.in“ genannt und die Ausgabedatei „config.h“ genannt. In den .in Dateizeilen wie folgt aus:

#cmakedefine BUILD_WITH_OPTION_BAR 1 

mit

ersetzt
#define BUILD_WITH_OPTION_BAR 1 

, wenn die Option aktiviert ist, andernfalls sind sie als Kommentar gekennzeichnet.

Weitere Informationen finden Sie unter https://cmake.org/cmake/help/v3.0/command/configure_file.html und http://www.vtk.org/Wiki/CMake:How_To_Write_Platform_Checks.