ubuntuusers.de

Problem mit g++ und dem Linker (ld) beim Bibliotheksimport

Status: Gelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

migr

Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

Liebe Leute, ich versuche gerade, ein C++-Programm mithilfe von Boost_Thread (http://boost.org) zu schreiben. Das Paket libboost-thread1.37.0 habe ich per Synaptic installiert.

Das Problem ist, er will die Lib einfach nicht finden!!! Mein Aufruf:

1
2
cd Code/C
g++ -o ~/bin/threadtest threadtest.cpp -lboost_thread

Er meint darauf:

threadtest.cpp:2:27: Fehler: boost/thread.hpp: No such file or directory
threadtest.cpp:3:25: Fehler: boost/bind.hpp: No such file or directory
threadtest.cpp: In function »int main()«:
threadtest.cpp:8: Fehler: »boost« wurde nicht deklariert
threadtest.cpp:8: Fehler: expected `;' before »thrd«
threadtest.cpp:9: Fehler: »thrd« wurde in diesem Gültigkeitsbereich nicht definiert

Das Programm:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#import <iostream>
#import <boost/thread.hpp>
#import <boost/bind.hpp>

using namespace std;

int main(void) {
	boost::thread thrd(boost::bind());
	return thrd.start();
}

int do_something() {
	for(int i = 0; i < 20; i++) {
		cout << "ROFL!";
	}
	return 0;
}

Was mache ich falsch?

MfG., Migr

migr

(Themenstarter)
Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

Das gleiche Problem habe ich übrigens auch mit wxWidgets, es scheint also nicht an Boost zu liegen.

Vielen Dank im Voraus, Migr

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4712

Wohnort: Berlin

@migr: Dein Problem sind nicht die Bibliotheken, sondern die Header-Dateien. Die musst Du auch installieren. Die befinden sich üblicherweise in Paketen, deren Name mit dev endet.

migr

(Themenstarter)
Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

Danke für die kurzfristige Antwort!!!

So hat es auch funktioniert. Allerdings hatte das Programm selbst auch noch ein paar Fehler.

Hier die aktualisiert Variante (für alle, die es interessiert 😉)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#import <iostream>
#import <boost/thread.hpp>
#import <boost/bind.hpp>

using namespace std;

void do_something();

int main(void) {
	boost::thread thrd(boost::bind(&do_something));
	thrd.join();
	cout << "Ende des Programms!!!\n";
	return 0;
}

void do_something() {
	for(int i = 0; i < 20; i++) {
		cout << "ROFL! ";
	}
	cout << "\n\nEnde des Threads!!!\n";
}

Viel Spaß damit und nochmals Danke!!! Migr

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Wozu soll der bind-Aufruf gut sein? An sich sollte das auch ohne gehen. ìnt main(void) ist in C++ länger als nötig, int main() reicht völlig (in C89 ist int main(void) allerdings zu empfehlen).

migr

(Themenstarter)
Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

Hello World schrieb:

Wozu soll der bind-Aufruf gut sein? An sich sollte das auch ohne gehen. ìnt main(void) ist in C++ länger als nötig, int main() reicht völlig (in C89 ist int main(void) allerdings zu empfehlen).

Der Boost::Thread will doch sonst eine Struct/ein Obj haben, das einen operator()() definiert. Das wollte ich mir sparen.

Gibt es einen besseren Weg als das?

Gruß, Migr

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

migr schrieb:

Der Boost::Thread will doch sonst eine Struct/ein Obj haben, das einen operator()() definiert.

Nein, es will ein "Callable", also irgend etwas, das man aufrufen kann. Entsprechend kann man auch einfach &do_something statt bind(&do_something) übergeben.

migr

(Themenstarter)
Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

Danke, Hello World!!!

Aber sagt mal, wie soll man den folgendes bewerkstelligen???

1
void add_mesg_slot(FUNCTION* slot);

Welchen Typ hat ein Funktionspointer??? Ist function* wirklich mögl.???

Migr

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

migr schrieb:

Welchen Typ hat ein Funktionspointer??? Ist function* wirklich mögl.???

Nein, der Compiler muss die Typen der Argumente und des Rückgabewerts kennen. Ein Zeiger auf eine Funktion, die einen int nimmt und einen std::string zurückgibt, hätte z. B. den Typen std::string (*)(int). Gib einfach mal function pointer bei google ein.

migr

(Themenstarter)
Avatar von migr

Anmeldungsdatum:
7. Februar 2009

Beiträge: 33

@Hello World: Danke, hat mir sehr geholfen 😉

Migr

Antworten |