2017-10-03 4 views
0

Ich versuche derzeit, mein Verständnis über CMake zu vertiefen. Ich versuche, http://libqglviewer.com/introduction.html]LibQGLViewer als eine Third-Party-Bibliothek in einem C++ - Projekt von mir zu verwenden.Cmake Problem mit dem Bau einer kleinen Bibliothek

Die CMakeLists.txt in dem zugehörigen Unterverzeichnis sieht wie folgt aus, wo der Teil, ich habe Fragen der add_libary Abschnitt ist und einige Header und Quelldateien wurden aus Gründen der Übersichtlichkeit weggelassen

cmake_minimum_required (VERSION 3.5.1 FATAL_ERROR) 

set(target_name QGLViewerQt5) 
project(${target_name}) 

message(STATUS "BUILDING QGLViewer-2.7.0 FROM SOURCE!") 

set(BASE_DIR QGLViewer) 
set(VRENDER_DIR VRender) 
set(CMAKE_AUTOMOC ON) 

set(QGLheaders 
    ${BASE_DIR}/camera.h 
    ${BASE_DIR}/config.h 
    ${BASE_DIR}/${VRENDER_DIR}/AxisAlignedBox.h 
    ${BASE_DIR}/${VRENDER_DIR}/Exporter.h 
) 


set(QGLsources 
    ${BASE_DIR}/camera.cpp 
    ${BASE_DIR}/${VRENDER_DIR}/Exporter.cpp 
) 

add_library(${target_name} ${QGLsources} ${QGLheaders}) 
target_include_directories(${target_name} 
PUBLIC . 
) 

target_link_libraries(${target_name} 
    ${OPENGL_LIBRARIES} 
    Qt5::Core 
    Qt5::Widgets 
    Qt5::Xml 
    Qt5::OpenGL 
) 

set(CMAKE_AUTOMOC OFF) 

install(TARGETS ${target_name} DESTINATION lib) 

Meine Anwendung läuft und alles ist fein.

Ich lese jedoch, dass man nur die Quelldateien mit add_library einschließen und dann target_include_directories verwenden sollte, um die zugehörigen Header-Dateien zu berücksichtigen. So ändere ich den obigen Teil zu

add_library(${target_name} SHARED ${QGLsources}) 
target_include_directories(${target_name} 
    PUBLIC 
    ${PROJECT_SOURCE_DIR}/QGLViewer 
    ${PROJECT_SOURCE_DIR}/QGLViewer/VRender 
) 

aber jetzt bekomme ich einen Fehler versucht, mein Projekt

fatale Fehler zu machen: QGLViewer/qglviewer.h: Keine solche Datei oder das Verzeichnis Kompilierung beendet.

können Sie mir bitte

  • sagen, was genau PUBLIC tut. machen? Ich weiß, was PUBLIC tut, aber was bedeutet der Punkt?
  • Warum funktioniert es nicht wie zuvor?

danken Ihnen im Voraus

PS: Die Ordnerstruktur ist als

enter image description here

folgt

enter image description here

+0

Bleibt der Aufruf von 'target_link_libraries' im geänderten Code? – Tsyvarev

+0

ja es tut, und es hat keinen Einfluss auf das Ergebnis –

+0

@CarstenD Ich schlage vor, ersetzen Sie Bilder des Dateibaums mit der [folgenden Darstellung] (https://meta.stackexchange.com/questions/147467/is-there-a-good -way-zur-Darstellung-Datei-Struktur-in-Frage-Antwort) – Liastre

Antwort

1

Firts ein, target_include_directories() Syntax official docstarget_include_directories(<target> [SYSTEM] [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) wie Sie es nach folgenden hat sehen Einige Schlüsselwörter könnten verwendet werden:

  • PRIVATE: fügt Verzeichnisse INCLUDE_DIRECTORIES Eigenschaft <target>
  • INTERFACE: fügt Verzeichnisse INTERFACE_INCLUDE_DIRECTORIES Eigenschaft <target>
  • PUBLIC: fügt Verzeichnisse INCLUDE_DIRECTORIESundINTERFACE_INCLUDE_DIRECTORIES Eigenschaften von <target>

Was Diese Eigenschaften:

  • INCLUDE_DIRECTORIES - enthält eine Liste von Verzeichnissen, die Header-Dateien Sie verwenden in Projekt
  • INTERFACE_INCLUDE_DIRECTORIES suchen - enthält eine Liste von Verzeichnissen Header suchen zu Dateien, aber es hat transitivity, das heißt, Sie können Sie gehören erben Verzeichnisse durch target_link_libraries()

Zweite ein verknüpft Projekt Code funktioniert nicht, weil Sie eine andere Pfade enthalten Ordner verwenden, die Quelldatei etwas wie #include <QGLViewer/qglviewer.h> enthalten sein müssen, aber Da Sie den Stammordner nicht mehr einschließen (. in Ihrem vorherigen Code), aber QGLViewer direkt verknüpfen, müssen Sie #include <qglviewer.h> eingeben. Korrigieren Sie es für jede #include, die Sie verwenden, oder fügen Sie stattdessen ${PROJECT_SOURCE_DIR} zu target_include_directories hinzu.

+0

vielen Dank für Ihre ausführliche Antwort:) Was ist der Unterschied zwischen und "" Syntax? –

+0

@CarstenD, ich schlage vor, dass Sie die Suche nach stackoverflow verwenden, könnte es sein, dass Ihre Frage bereits eine [Antwort] (https://stackoverflow.com/a/21594/4121301) hat. Und übrigens, keine Ihrer Fragen hat keine akzeptierte Antwort (auch wenn sie es ist), wenn diese oder irgendeine Antwort Ihre Frage gelöst hat, denken Sie bitte daran [sie zu akzeptieren] (https://meta.stackexchange.com/q/5234/179419) durch Anklicken des Häkchens. Dies zeigt der breiteren Gemeinschaft, dass Sie eine Lösung gefunden haben und sowohl dem Antworter als auch Ihnen einen guten Ruf verschaffen. Das ist ein angemessener Weg, um Dankbarkeit zu zeigen. – Liastre

+0

danke, ich habe die Antwort jetzt überprüft =) Eine andere Frage, die ich habe, ist, wie weiß ich, ob eine bestimmte Bibliothek, z. OpenGL unterstützt Alias ​​'wie Qt tut, d. H. Qt :: Widgets und was ist die Verwendung dieser Alias' sowieso, wenn ich einfach $ {Boost_LIBRARIES} eingeben kann und es dasselbe tut? –

Verwandte Themen