Stránka 1 z 1

C++ oddělený překlad

Napsal: čtv 27. čer 2013, 14:17
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.

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

Napsal: čtv 27. čer 2013, 21:19
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.

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

Napsal: čtv 27. čer 2013, 21:29
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.

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

Napsal: čtv 27. čer 2013, 22:03
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.

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

Napsal: čtv 27. čer 2013, 22:12
od krakenuss
Tak jsem na to přišel. Je nutné zkompilovat každy soubor zvlast a potom to slinkovat pomoci g++ -o

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

Napsal: sob 29. čer 2013, 18:23
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. :-)

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

Napsal: pon 1. črc 2013, 18:36
od nou
lenze za prve nie je to standart a za druhe raz niekto da klasicky include a vsetko sa rozbije.

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

Napsal: úte 2. črc 2013, 11:04
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.

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

Napsal: stř 3. črc 2013, 10:30
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.

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

Napsal: stř 3. črc 2013, 10:58
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.

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

Napsal: pon 19. srp 2013, 19:20
od Maranov
Bump.

Našel jsem další argument pro pragma: Neplní to Intellisense a další zbytečnými global members. :-)