Portál AbcLinuxu, 7. května 2025 19:47

Dotaz: Kompilace Qt app, první díl seriálu

20.6.2013 16:43 Adam Lasák
Kompilace Qt app, první díl seriálu
Přečteno: 323×
Odpovědět | Admin
Dobrý den, Základní problém, reinstaloval jsem si Ubuntu, nyní mám verzi 12.04. Začal jsem programovat v knihovně Qt, napsal jsem kód, který je zde uveden (nějaký check box, label, ...) no a jak jsem začal kopmilovat pomocí make (makefile už je, tj. qmake -project, qmake) vypsalo mi to následující chybu:

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o hello_world.o hello_world/hello_world.cpp g++ -m64 -Wl,-O1 -o qt hello_world.o main.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread main.o: In function `trida_check::trida_check(QWidget*)': main.cpp:(.text+0x0): multiple definition of `trida_check::trida_check(QWidget*)' hello_world.o:hello_world.cpp:(.text+0x0): first defined here main.o: In function `main': main.cpp:(.text.startup+0x0): multiple definition of `main' hello_world.o:hello_world.cpp:(.text.startup+0x0): first defined here main.o: In function `trida_check::trida_check(QWidget*)': main.cpp:(.text+0x0): multiple definition of `trida_check::trida_check(QWidget*)' hello_world.o:hello_world.cpp:(.text+0x0): first defined here collect2: ld returned 1 exit status make: *** [qt] Error 1

Vím jen že, jak jsem před reinstalováním systému tenhle program (kód uveden níže) kopmiloval, vše pracovalo v klidu. Problém je zjevně na straně nějakých chybějících modulů tušim. Koukal jsem na nějaké anj poradny, stahoval jsem balíčky co tam doporučovali stáhnout a stálě nic, opravdu si už nevím rady. Jinak to že u hlaviček nejsou šipky si nevšímejte, nechtělo mi to sem povolit...
#include QApplication
#include QPushButton
#include QLabel
#include QHBoxLayout //slouží k zarovnání prvků, snažší než zadávat souřadnice
#include QCheckBox

class trida_check : public QWidget
{
	public:
		/* 
		 * Jako argument konstruktoru se předává rodič,
		 * v případě že se jedná o hlavní okno tak žádný
		 * rodič, v našem případě 0
		*/
		trida_check(QWidget* parent = 0);
};

trida_check::trida_check(QWidget*){
	QHBoxLayout* radek = new QHBoxLayout(this);
	QPushButton* tlacitko = new QPushButton(tr("Check this motherfucker!"));
	QCheckBox* zaskrtavaci_pole = new QCheckBox();
	
	//tlačítko lze zamáčknout
	tlacitko->setCheckable(true);
	
	//propojí objekty, třetí parametr je ukazatel na instanci objektu Qt, jehož slot se má spustit v reakci na signál.
	connect(tlacitko, SIGNAL(clicked()), zaskrtavaci_pole, SLOT(toogle()));
	connect(zaskrtavaci_pole, SIGNAL(clicked()), tlacitko, SLOT(toogle()));
	
	//přidá do lajny naše objekty
	radek->addWidget(tlacitko);
	radek->addWidget(zaskrtavaci_pole);
	
	//použije daný řádek (layout)
	setLayout(radek);
}

int main(int argc, char** argv)
{
	//instance třídy Qapplication, předávají se argumenty shellu, musí být v každém GUI programu
	QApplication app(argc, argv);
	
	QLabel win("Hello fucking world!"); //instance popisku
	QPushButton tlacitko("&Quit"); //instance buttonou
	
	//qApp, ukazatel na třídu QApplication, connect, přetížená metoda na propojení třídy qApp a buttonu
	//QObject:: se pak může i vynechat z důvodu častého výskytu
	QObject::connect(&tlacitko, SIGNAL(clicked()), qApp, SLOT(quit()));
	/*
	 * Signál je zvláštní metoda, která nemá tělo a nevrací hodnotu, má pouze prototyp. 
	 * Slot je metoda, která se zavolá v reakci na nějaký signál
	 */
	
	trida_check objekt;

	//zobrazení okna, pzn...nečekaně
	tlacitko.show();
	win.show();
	
	return app.exec(); //vracení výsledku metody app
}


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Luboš Doležel (Doli))
20.6.2013 17:20 potato
Rozbalit Rozbalit vše Re: Kompilace Qt app, první díl seriálu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Slinkováváš dohromady main.o a helo_world.o, což jsou podle všecho objektové soubory dvou samostatných programů, takže není divu, že je pak main() (a kdeco dalšího) definováno dvakrát.
20.6.2013 18:02 Adam Lasák
Rozbalit Rozbalit vše Re: Kompilace Qt app, první díl seriálu
Jéééjda, taková cipovina!! Dík moc.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.