2017-01-02 3 views
-1

Ich arbeite normalerweise an Ubuntu, mit CMake und nativer Umgebung. Mein Projekt kompiliert und läuft gut. Jetzt bin ich auf OSX und vor allem erhalte ich einige Warnungen, wenn QCustomPlot Kompilieren:Wie kompiliere ich QCustomPlot für OSX?

QCustomPlot/include/qcustomplot.h:6007:15: warning: 
     'findEnd' overrides a member function but is not marked 'override' 
     [-Winconsistent-missing-override] 
    virtual int findEnd(double sortKey, bool expandedRange=true) const; 
      ^
../QCustomPlot/include/qcustomplot.h:3830:15: note: 
     overridden virtual function is here 
    virtual int findEnd(double sortKey, bool expandedRange=true) const = 0; 

Ich nehme ich diese Warnung unterdrücken kann. Ich mag es jedoch nicht, Warnungen zu unterdrücken, wenn sie eine echte Gefahr bedeuten können. (unter Ubuntu gibt es keine Warnung). Warum ist es eine Warnung? Ich denke, eine virtuelle Funktion zu überschreiben ist nicht wirklich ungewöhnlich oder gefährlich.

Jedenfalls mit Warnungen, aber dompiles. Das eigentliche Problem scheint mit Verknüpfung

[ 4%] Building CXX object QCustomPlot/CMakeFiles/libQCustomPlot.dir/libQCustomPlot_automoc.cpp.o 
[ 5%] Linking CXX shared library libQCustomPlot.dylib 
Undefined symbols for architecture x86_64: 
    "qt_assert_x(char const*, char const*, char const*, int)", referenced from: 
     QList<QCPDataRange>::at(int) const in qcustomplot.cpp.o 
     QList<QCPDataRange>::operator[](int) in qcustomplot.cpp.o 

Was ist das Problem hier? (Als eine Multi-Plattform-Entwicklungsumgebung verwenden, ich habe nicht erwartet, jede fehlende Datei, Komponente oder ähnliches Problem.)

Edit: hier geht die CMake-Datei, die es

produzierte
set(CMAKE_AUTOMOC ON) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
find_package(Qt5 COMPONENTS Core Widgets PrintSupport REQUIRED) 

include_directories(
     ${Qt5Widgets_INCLUDE_DIRS} 
     ${Qt5Printer_INCLUDE_DIRS} 
     include 
    ) 

add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Printer_DEFINITIONS}) 

QT5_WRAP_CPP(qcustomplot_moc include/qcustomplot.h) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} -std=c++11 -Wall") 

ADD_LIBRARY(libQCustomPlot 
    qcustomplot.cpp 
    ${qcustomplot_moc} # The MOC headers, generated 
) 

set_target_properties(libQCustomPlot 
         PROPERTIES OUTPUT_NAME QCustomPlot 
        ) 
target_include_directories(libQCustomPlot PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 
) 
+0

Ich würde wirklich froh sein, wenn vorher/nachher/in/addition_to downvoting, würden Sie einen Kommentar hinterlassen, warum. – katang

+0

Ich habe nicht downvote, aber ich denke, dass Sie mehr Details über den Fehler angeben sollten: Führen Sie "make VERBOSE = 1" statt "make" aus, um zu sehen, welche Bibliotheken verknüpft sind. Suchen Sie insbesondere nach Qt5Core, das der sein sollte, der qt_assert_x enthält. Kannst du etwas erfolgreich mit qmake bauen? Zum Beispiel die QCustomPlot Beispiele? Die Warnung ist nichts, worüber man sich Sorgen machen muss; Es wird vorgeschlagen, den Überschreibungsspezifizierer zu verwenden, der in C++ 11 eingeführt wurde. Aber ich denke, QCustomPlot hält Kompatibilität mit älterem C++. Wenn Sie C++ 11 nicht benötigen, sollte 'set (CMAKE_CXX_STANDARD 98)' die Warnung entfernen. – pepan

Antwort

0

Die CMakeLists.txt fehlt die Linie

target_link_libraries(libQCustomPlot Qt5::Widgets) 

Siehe die Qt documentation on compiling with CMake. Wenn CMakeLists.txt CMake-Versionen älter als 3.0 unterstützt, können viele seiner aktuellen Inhalte außerdem entfernt werden. Es kann so zu etwas reduziert werden:

set(CMAKE_AUTOMOC ON) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
find_package(Qt5 COMPONENTS Core Widgets PrintSupport REQUIRED) 

include_directories(include) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -W -Wall") 

ADD_LIBRARY(libQCustomPlot 
    qcustomplot.cpp 
) 

set_target_properties(libQCustomPlot 
         PROPERTIES OUTPUT_NAME QCustomPlot 
        ) 

target_link_libraries(libQCustomPlot Qt5::Widgets) 

target_include_directories(libQCustomPlot PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> 
) 

Mehr Details über GCC nicht auf undefinierte Referenzen andernfalls kann in this question finden.

Die Warnung bezieht sich auf eine fehlende override specifier in einer Funktion, die eine andere Funktion überschreibt. Folgendes wird die Warnung vermeiden:

virtual int findEnd(double sortKey, bool expandedRange=true) const override; 
+0

Danke für die detaillierte Erklärung. Ich habe nicht in diese Richtung gesucht, da die gleiche CMake-Datei kompiliert, verlinkt und unter Ubuntu läuft. – katang

+0

Wenn ich $ {Qt5Widgets_INCLUDE_DIRS} aus include_directories() weglasse, erhalte ich die Fehlermeldung 'QtCore/qglobal.h not found'. Wenn ich QT5_WRAP_CPP (qcustomplot_moc include/qcustyplot.h) entferne, erhalte ich Fehlermeldungen vom Typ 'undefinierter Verweis auf' vtable for QCPCurve '. – katang

+0

Was ist deine CMake-Version? Wenn Sie nichts entfernen, sondern nur die Zeile target_link_libraries hinzufügen, wird alles kompiliert? – pepan