Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 23.03.15 - klo:16.31
-
Laitoin uutena asennuksena Ubuntu 14.04:ssä
sudo apt-get install qt4-dev-tools
sudo apt-get install libqwt-dev
mutta virheeksi tulee
In file included from qwtkoe04.cpp:7:0:
qwtkoe04.h:5:29: fatal error: QApplication: Tiedostoa tai hakemistoa ei ole
#include <QApplication>
Vasta jälkeen päin huomasin, että edellä olevat apt-get -asennukset olin ajanut siitä hakemistosta, jossa on kokeiluohjelmanikin, mutta ei kai se vaikuta siihen, miten Ubuntu asentaa Qt:n ja Qwt:n?
Joku perusasia on väärin asennuksessani, koska QApplication -tiedostoa ei löydy.
.pro -tiedosto on tällainen (lisäilin siihen sitten kokeiluissa CONFIG:n ja widgetit, LIBSit ja INCLUDEPATH ovat lisäyksiä ennen toimineesta .pro -tiedostosta)
######################################################################
# Automatically generated by qmake (3.0) ma maaliskuuta 23 16:07:02 2015
######################################################################
TEMPLATE = app
TARGET = qwtkoe04
INCLUDEPATH += .
# Input
HEADERS += qwtkoe04.h
SOURCES += qwtkoe04.cpp
# lisäsin nämä 2 riviä, mutta ei auta
CONFIG += qwt
Qt += widgets
# nämä kaksi riviä on lisättävä käsin, ainakin ennen toimi näillä
CONFIG += qwt
INCLUDEPATH += /usr/include/qwt
LIBS += -lqwt
Miten saisin qt:n ja qwt:n taas toimimaan?
-
# lisäsin nämä 2 riviä, mutta ei auta
CONFIG += qwt
Qt += widgets
Tuossa pitäisi olla QT += widgets
-
Kiitos oikaisusta, nyt on siis palattu lähtöruutuun eli siihen tilanteeseen, joka oli ennen kuin aloin uudelleen asentamaan qt:tä ja qwt:tä. Siinä jossain vaiheessa sitten QT ja Qt menivät sekaisin.
Alun perin ongelma oli se, että saan koeohjelman käännettyä koneella, jossa on Ubuntu 12.04 ja ohjelma toimii myös siinä 14.04 koneessa, jossa kääntäminen menee muuten läpi ilman virheilmoituksia, mutta kun käännetyn ohjelman ajaa, tulee virheeksi muistialueen ylitys (luotiin core-tiedosto). Muistaakseni 12.04 -koneessa on samat paketit kuin 14.04 -koneessa.
Koska 12.04 - koneessa käännettynä ohjelma toimii kummassakin koneessa, kuvittelisin ohjelman sinällään olevan suurin piirtein oikein. Mutta miten pääsisi sen muistialueen ylityksen jäljille. Jotenkinhan se riippuu jostain eroista koneiden välillä.
-
Mutta miten pääsisi sen muistialueen ylityksen jäljille. Jotenkinhan se riippuu jostain eroista koneiden välillä.
Debuggerilla voi selvitellä, joskin hankalammissa tapauksissa backtracen tulkinta voi olla vaikeaa.
Voit myös yksinkertaisesti kommentoida koodia pois käytöstä ja takaisin käyttöön, kunnes ongelman aiheuttava kohta on haarukoitu. Onnistuu nopeimmin binäärihaun tapaan, eli esim. pääfunktiossa puolet koodista pois ja testaus. Jos ohjelma käynnistyy, vika oli kommentoidussa osassa. Jos ei toimi vieläkään, vika on siinä osassa, jota ei ole kommentoitu. Sitten tutkimista voi jatkaa samaan tapaan siinä osassa koodia, johon vika on paikannettu.
-
Tässä olisi vähän lisähavaintoja. Yritin selvittää asiaa koodia poistamalla ohjelmasta rivejä.
Ohjelma on nyt aika lyhyt, ja se näyttä vain qwt:n kaavion ilman kuvaajaa. Käänsin sen 12.04 koneella, jossa on qt ja qwt viime keväältä.
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QwtPlot *myPlot = new QwtPlot;
myPlot->show();
return a.exec();
}
ja tässä vielä pro-tiedosto
######################################################################
# Automatically generated by qmake (3.0) ma maaliskuuta 23 13:10:22 2015
######################################################################
TEMPLATE = app
TARGET = qwtkoe01
INCLUDEPATH += .
# Input
SOURCES += qwtkoe01.cpp
QT += widgets
# nämä rivit on lisättävä käsin, ainakin ennen toimi näillä
CONFIG += qwt
INCLUDEPATH += /usr/include/qwt
LIBS += -lqwt
Virheinä tulee ohjelmaa ajettaessa nyt virheellien osoite
mini@mini:~/qt/harjoittelu2/qwtkoe01$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/qwt -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o qwtkoe01.o qwtkoe01.cpp
g++ -m64 -Wl,-O1 -o qwtkoe01 qwtkoe01.o -L/usr/X11R6/lib64 -lqwt -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread
mini@mini:~/qt/harjoittelu2/qwtkoe01$ ./qwtkoe01
*** Error in `./qwtkoe01': realloc(): invalid pointer: 0x00007ff0cf3c1840 ***
Keskeytetty (luotiin core-tiedosto)
Sellainen ero 12.04 - ja 14.04 - koneiden välillä ainakin on, että QT += widgets ei tunnistu 12.04 - koneessa, mutta siinä ohjelmat kääntyvät ja toimivat, kun widgetsin kommentoi pois. Käännetty ohjelma toimi sitten 14.04 - koneessakin.
Kyse on luultavastikin versioeroista, vaikka olin asentavinani kumpaankin koneeseen qwt:n ja qt:n samoilla komennoilla, mutta 12.04 - koneeseen siis viime keväänä, muistaakseni.
Nytkin yritin qt:n, qwt:n ja g++:n asentamista niin, että poistin kaikki löytämäni qt- tai qwt- aiheiset tiedostot koneelta ennen uutta asennusta päätteestä. Toivottavasti mitään vanhaa ei jäänyt sotkemaan, mutta sen olisi varmaan apt-get osannut kirjoittaa päälle.
Jos jollain kokeiluohjelmani toimii 14.04 versiossa, voin taas yrittää vaikka poistaa kaikki qt- ja qwt-aiheiset tiedostot ja yrittää asennusta apt-getillä vielä uudestaan.
-
mini@mini:~/qt/harjoittelu2/qwtkoe01$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -I/usr/include/qwt -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o qwtkoe01.o qwtkoe01.cpp
g++ -m64 -Wl,-O1 -o qwtkoe01 qwtkoe01.o -L/usr/X11R6/lib64 -lqwt -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread
Sinulla on asennettuna Qt 5 -kehitysympäristö ja käytät sen qmakea. Qwt toimii vain Qt 4:n kanssa. Asenna Qt 4 -kehitysympäristö (ellei ole jo asennettuna) ja aja qmake näin:
qmake -qt4
Voit myös poistaa Qt 5:n dev-paketit, jos et niitä tarvitse. Silloin komento qmake ajaa suoraan Qt 4:n qmaken, eikä lisäparametria tarvita.
(Käytännössä /usr/bin/qmake on symbolinen linkki qtchooser-ohjelmaan, jonka avulla voi valita, minkä Qt-version työkaluja käytetään. qmake -qt4 vastaa komentoa qtchooser -run-tool=qmake -qt=4)
Kannattaa myös lisätä pro-tiedostoon tarkistus ja virheilmoitus:
greaterThan(QT_MAJOR_VERSION, 4): error("Requires Qt 4. On Ubuntu, run qmake with parameter -qt4")
-
Ratkaisu näyttää olevan
qmake -qt4
joka tekee 4-versiolle sopivan makefilen.
Kiitos neuvosta :)