C++ oddělený překlad

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
krakenuss
Začátečník
Začátečník
Registrován: 14. úno 2010

C++ oddělený překlad

Příspěvek od krakenuss »

Mam problem zkompilovat program v C++, ktery je rozdělen do vice souborů. Uvedu zde jednoduchy příklad (stejnych chyb jsem se dočkal i u složitejšich programu, proto uvedu jednoduchy at se v tom da vyznat :D)

main.cpp

Kód: Vybrat vše

#include <iostream>
#include "test.h"

int main()
{
	Vektor v(4, 6);
	
	v.vypis();
	
	std::cin.get();
	std::cin.get();
	return 0;
}
test.h

Kód: Vybrat vše

#ifndef TEST
#define TEST

class Vektor
{
private:
	float a, b;
public:
	Vektor(float a, float b);
	Vektor();
	~Vektor() {}
	void vypis();
};

#endif
test.cpp

Kód: Vybrat vše

#include "test.h"
#include <iostream>

Vektor::Vektor(float a, float b)
{
	this->a = a;
	this->b = b;
}

Vektor::Vektor()
{
	this->a = 0;
	this->b = 0;
}

void Vektor::vypis()
{
	std::cout << "(" << a << "; " << b << ")" << std::endl;
}


kdyz to dam zkompilovat tak to vypise tohle:
/home/weedmaster/projects/MCPP7.8/build> make
Linking CXX executable mcpp7.8
CMakeFiles/mcpp7.8.dir/main.o: In function `main':
/home/weedmaster/projects/MCPP7.8/main.cpp:6: undefined reference to `Vektor::Vektor(float, float)'
/home/weedmaster/projects/MCPP7.8/main.cpp:8: undefined reference to `Vektor::vypis()'
collect2: error: ld returned 1 exit status
make[2]: *** [mcpp7.8] Error 1
make[1]: *** [CMakeFiles/mcpp7.8.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***
At jsem to zkompiloval v KDevelop, Geany, nebo ručně přes G++, porad stejna chyba.
Vsadil bych se že to bude nejaka banalni chyba, ale je to už celkem davno co jsem dělal projekty v C nebo C++, proto prosim o radu.
Trovaricon
Začátečník
Začátečník
Registrován: 26. dub 2010

Re: C++ oddělený překlad

Příspěvek od Trovaricon »

pripada mi to ako nejak dodrbany linker (neviem, c++ je u mna dnes uz velmi okrajova zalezitost)

Visual Studio 2012 to zbuilduje bez pripomienok.
Gigabyte GA-970A-UD3, 16GB ECC DDR3, AMD FX6300, Xigmatek Loki, Asus HD7770 DirectCU, Intel 330 180GB / Seagate 7200.14 1.5TB + 2TB, Corsair CX400, CM 330K (mod), Philips 235PQ2EB + 231P4QPY, Windows 10 x64 Pro
dohnalik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 16. říj 2009
Bydliště: Brno

Re: C++ oddělený překlad

Příspěvek od dohnalik »

Letmým pohledem tam nevidím chybu, nechybí ti tam nějaký knihovna inklůdlá? Pokud máš soubory ve stejné složce jako main, mělo by to jít. Není problém i když jsou v podsložkách, linker si to musí najít.
krakenuss
Začátečník
Začátečník
Registrován: 14. úno 2010

Re: C++ oddělený překlad

Příspěvek od krakenuss »

Trovaricon píše:pripada mi to ako nejak dodrbany linker (neviem, c++ je u mna dnes uz velmi okrajova zalezitost)

Visual Studio 2012 to zbuilduje bez pripomienok.
Visual Studio....ano s tim opravdu nebyly problemy, od te doby jsem jaksi změnil OS, takze Visual Studio nemam k dispozici.
krakenuss
Začátečník
Začátečník
Registrován: 14. úno 2010

Re: C++ oddělený překlad

Příspěvek od krakenuss »

Tak jsem na to přišel. Je nutné zkompilovat každy soubor zvlast a potom to slinkovat pomoci g++ -o
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: C++ oddělený překlad

Příspěvek od Maranov »

Tak. Respektive to můžeš udělat rovnou: g++ a.ccp b.cpp c.cpp ... -o aplikace.exe

A BTW, přečti si o "#pragma once", je to elegantnější než ty #ifdef locky. :-)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
nou
Začátečník
Začátečník
Registrován: 11. pro 2009

Re: C++ oddělený překlad

Příspěvek od nou »

lenze za prve nie je to standart a za druhe raz niekto da klasicky include a vsetko sa rozbije.
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: C++ oddělený překlad

Příspěvek od Maranov »

Je to nestandard, který podporován prakticky všude. Striktním dodržováním ISO se člověk moc daleko nedostane. Funguje to i v kombinaci s těmi klasickými locky, takže se to nerozbije, ledaže by tam nebylo nic.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
nou
Začátečník
Začátečník
Registrován: 11. pro 2009

Re: C++ oddělený překlad

Příspěvek od nou »

presne tie locky tam clovek musi pisat tak ci tak a v konecnom dosledku je #include a #pragma once uplne rovnake a to #pragma mi nic neprinesie. ani vykon pri preklade pretoze inteligentne prekladace dokazu rozoznat ci uz bol dany hlavickovy subor vlozeny aj pri #include.
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: C++ oddělený překlad

Příspěvek od Maranov »

Tak, dneska to nic nepřinese, ale když je to de facto pro drtivou většinu překladů/překladačů to samé, proč psát 3 řádky místo jednoho, že.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: C++ oddělený překlad

Příspěvek od Maranov »

Bump.

Našel jsem další argument pro pragma: Neplní to Intellisense a další zbytečnými global members. :-)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
Odpovědět

Zpět na „Programování a web“