Instalacja Boost dla DevCPP

0

Próbuje zainstalować bibliotekę boost pod DevCPP. Chodzi mi o wykorzystanie <boost/thread/thread.hpp>.

Ściągam więc plik boost_1_42_0.7z ze strony
http://sourceforge.net/projects/boost/files/boost/1.42.0/

i plik boost-jam-3.1.17-1-ntx86.zip ze strony
http://sourceforge.net/projects/boost/files/boost-jam/3.1.17/

Po rozpakowaniu ustawiam odpowiednią zmienną środowiskową stanowiącą ścieżkę do bjam.exe, wchodzę do katalogu z boostem .\boost_1_42_0, po czym uruchamiam bjama w poniższy sposób:

bjam –toolset=gcc –with-thread –stagedir=. debug release link=static runtime-link=shared threading=multi stage

Wypisuje coś takiego:

D:\Dev-Cpp\boost_1_42_0>bjam -toolset=gcc -with-thread stage
WARNING: No python installation configured and autoconfiguration
         failed.  See http://www.boost.org/libs/python/doc/building.html
         for configuration instructions or pass --without-python to
         suppress this message and silently skip all Boost.Python targets
warning: No toolsets are configured.
warning: Configuring default toolset "msvc".
warning: If the default is wrong, your build may not work correctly.
warning: Use the "toolset=xxxxx" option to override our guess.
warning: For more configuration options, please consult
warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html

D:/Dev-Cpp/boost_1_42_0/tools/build/v2/build\property.jam:292: in validate1 from
 module property
error: Invalid property '<ľtoolset>gcc': unknown feature 'ľtoolset'.
D:/Dev-Cpp/boost_1_42_0/tools/build/v2/build\property.jam:301: in property.valid
ate from module property
D:/Dev-Cpp/boost_1_42_0/tools/build/v2/build\build-request.jam:216: in convert-c
ommand-line-element from module build-request
D:/Dev-Cpp/boost_1_42_0/tools/build/v2/build\build-request.jam:153: in build-req
uest.from-command-line from module build-request
D:/Dev-Cpp/boost_1_42_0/tools/build/v2\build-system.jam:591: in load from module
 build-system
D:\Dev-Cpp\boost_1_42_0\tools\build\v2/kernel\modules.jam:283: in import from mo
dule modules
D:\Dev-Cpp\boost_1_42_0\tools\build\v2\kernel\bootstrap.jam:142: in boost-build
from module
D:\Dev-Cpp\boost_1_42_0\boost-build.jam:17: in module scope from module

W katalogu z boostem tworzy się pusty katalog stage.

Próbuję robić pełną instalację podaną jako przykład gdzieś w dokumentacji

bjam ^
More? --build-dir="D:\Dev-Cpp\boost_1_42_0\stage" ^
More? --build-type=complete msvc stage

i skipuje builda. Jak w takim razie zrobić poprawną instalację ?

0

Zasugerowałem się tą stroną

http://jarekprzygodzki.blogspot.com/2008/11/dev-cpp-i-kompilacja-boosta-1370.html

Wygląda na to, że nie zaakceptował toolseta, ale czemu ?

0

takie minipytanie: a nie moglbys drapnac prekompilowanego boost'a ze storny boost consulting? nie pamietam jakiego kompilatora dev-cpp uzywa, ale zdziwilbym sie gdybys nie znalazl odpowiedniej paczki.

btw. jestes w 100% pewien ze chcesz uzywac dev'a a nie np. darmowych visualstudioexpress/netbeans/eclipse ?

0

Z netbeansem nie praktykowałem :). Z eclipsem jest trochę babrania, jeśli chce się kompilować C++. A Deva ściągasz i razi intuicyjnością. Ew. zostaje jako alternatywa visualstudioexpress. Mógłbym spróbować - a sposób podpięcia boosta dla VSE coś uprości ( może miałeś okazje podpinać ? :) ) ? Jak będę miał chwilę wolnego czasu to spróbuję się odnieść w praktyce do tego co zaproponowałeś.

0

Dobra - naszukałem się nieco i jestem krok do przodu. Robię tak:

bjam.exe "-sMINGW_ROOT_DIRECTORY=C:\Dev-Cpp" "-sTOOLS=mingw" install

albo lepiej - wybierając to, co jest mi potrzebne, tak:

bjam.exe "-sMINGW_ROOT_DIRECTORY=C:\Dev-Cpp" "-sTOOLS=mingw" "--with-thread" install

Wcześniej wrzucam boosta i bjama do katalogu C:\Boost.

I udaje mi się go zainstalować tylko częściowo - katalog include się tworzy - po podłączeniu go do Deva biblioteka boost nie wyrzuca błędu, ale wyskakuje Linker Error, bo nie umożliwiłem dostępu do katalogu lib. Katalog lib jest jednak pusty, bo wyskakuje failure przy próbie instalacji czegokolwiek, co powinno się tam znaleźć - przykład:

    cl /Zm800 -nologo @"bin.v2\libs\wave\build\msvc\release\link-static\threadin
g-multi\cpplexer\re2clex\aq.obj.rsp"

...failed compile-c-c++ bin.v2\libs\wave\build\msvc\release\link-static\threadin
g-multi\cpplexer\re2clex\aq.obj...
compile-c-c++ bin.v2\libs\wave\build\msvc\release\link-static\threading-multi\cp
plexer\re2clex\cpp_re.obj
Nazwa 'cl' nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne,
program wykonywalny lub plik wsadowy.

Nazwa 'cl' - ktoś gdzieś wspominał, że jest to plik (cl.exe), który jest w Visual Express, czy Studio ..
Sugerując się tym linkiem - http://jarekprzygodzki.blogspot.com/2008/11/dev-cpp-i-kompilacja-boosta-1370.html - wszystko ściągnąłem co trzeba. Mógłbym potworzyć jakieś zmienne środowiskowe, ale nie wiem gdzie znaleźć cl.exe, jeśli okaże się niezbędny.

0

K..wa ... może się ktoś sprężyć i odpisać na to pytanie ? Masa osób pisze w C++ - a jeśli tak, to masa osób musi korzystać z boosta. Nikt go nie instalował pod Dev-a ??? Nikt nie ma pomysłu co to za cl i i gdzie tego szukać ? Może ściągnąłem złego bjama ??

0

Nikt tego gówna (Dev-C++) nie używa. Poza bezużytecznym notatnikiem z mechaniką wcięć opartą na algorytmach kwantowych to ma archaiczną wersję MinGW/GCC na pokładzie, do tego strasznie zbugowaną. Zamiast pierniczyć się z kompilacją na tym starym złomie to ściągnij paczkę stąd - http://nuwen.net/mingw.html - GCC 4.5 + boost 1.43 i wpakuj gdzie trzeba, oszczędzisz czas i nerwy.

0

"wpakuj gdzie trzeba" :

Narzędzia -> Opcje kompilatora -> zakładka

  1. Kompilator - tworzę nowy kompilator o nazwie MinGW.
  2. Katalogi -> zakładka
    a) Binaria - dodaje C:\MinGW\bin
    b) Biblioteki - C:\MinGW\lib
    c) Pliki nagłówkowe C++ - C:\MinGW\include (a nawet dalej \boost)

Wpakowałem tak. MinGWa wg końcowych wniosków z opisu zainstalowałem tak jak trzeba. Odpalam aplikacje i ... nie wiem, czy to jakiś postęp, ale błędy są inne :]. Dobrze wmontowałem MinGWa w Devie ? Jeśli tak to prześlę kod do sprawdzenia u kogoś. Ale wypisuje Linker Error, więc coś źle podpiąłem.

0

Lepiej było wypakować do folderu deva i zastąpić oryginalny. Co do błędów - wróżki spytaj, nie podałeś nic użytecznego.

0

No o błędy napisałem, że na razie nie pytam, bo nie wiem, czy dobrze to podpiąłem. Spróbuję to wrzucić do Deva i zobaczę co się stanie. Jak nie ruszy to wyślę efekt.

0

Przykładowa zakleszczająca się aplikacja:

#include <cstdlib>
#include <iostream>
#include <boost/thread/thread.hpp>

using namespace std;

int result;
int x = 1, y = 0;

void thread111(void);
void thread112(void);
void thread11(void);
void thread12(void);
void thread1(void);
void thread2(void);
void thread3(void);
void thread4(void);
void thread5(void);

int f1(int, int);
int p2(int, int);

int f1(int x, int y){	
	boost::thread my_thread4(&thread4);
	return result;
}

int p2(int x, int y){	
	boost::thread my_thread5(&thread5);
	return result;
}

void thread111(){	
	f1(x, y);
}

void thread112(){
}

void thread11(){	
	while(x > y){		
		boost::thread my_thread111(&thread111);
	}	
	
	boost::thread my_thread112(&thread112);
}

void thread12(){
}

void thread1(){	
	boost::thread my_thread11(&thread11);	
	
	while(x > y){		
		boost::thread my_thread12(&thread12);
	}
}

void thread2(){	
	p2(x, y);
}

void thread3(){
}


void thread4(){	
	p2(x, y);
}

void thread5(){	
	f1(x, y);
}

int main(){
	
	boost::thread my_thread1(&thread1);
	
	while(x > y){		
		boost::thread my_thread2(&thread2);
	}	
	
	boost::thread my_thread3(&thread3);
	
	return 0;
}

Nie kompiluje się, bo:

  [Linker error] undefined reference to `boost::thread::~thread()' 
  (...)
  [Linker error] undefined reference to `__gxx_personality_sj0' 
  [Linker error] undefined reference to `_Unwind_SjLj_Register' 
  [Linker error] undefined reference to `_Unwind_SjLj_Unregister' 
  [Linker error] undefined reference to `_Unwind_SjLj_Resume' 
  ld returned 1 exit status 
  C:\Dev-Cpp\Workspace\Makefile.win [Build Error]  [BoostProject.exe] Error 1 

Może ktoś zainstalować Deva, skorzystać z tego programu
http://nuwen.net/mingw.html#install
i spróbować odpalić w nim mój kod ?

0

Ten nowy MinGW zawiera takie katalogi jak:
bin
include
lib
libexec

W folderze głównym Deva są też między innymi te. Więc wrzucilem MinGWa do folderu głównego. Ale w Devie jest jeszcze folder mingw32 a w nim bin i lib, a w środku śmiecie po starym kompilatorze o nazwach i386pe. Teraz już niczego nie kompiluje.

0

Czyli aż taka różnica pomiędzy wersjami by była? Średnio mam pojęcie jak to wyglądało kiedyś. Tamta paczka z GCC itd. jest w 100% sprawna. To jak już kompilator nie chodzi to zmień IDE wreszcie ;] Ściągnij Code::Blocks - to przynajmniej ma obsługę debugowania nie wymagającą debugowania IDE, jest stabilne i sensownie kod formatuje.

0

Mam k.wa dosyć tego syfu ! Powinni kogoś za to rozstrzelać. Zainstalowałem Code::Blocka i jest palce lizać, ale korzysta z kompilatora z Deva ... czemu ? Wyrzuciłem Deva i już nigdy więcej jego noga na mym dysku nie postanie. Odinstalowałem Coda - wyrzuciłem MinGW ... zainstalowałem RegCleanera, ale w rejestrach nie ma wzmianki o Codzie, czy Devie, albo jest, ale nie wiem gdzie. Zainstalowałem ponownie i .. odnosi się do Deva ... gdzie są wszystkie informacje o tym ? Chciałbym to usunąć. Poza tym znalazłem coś takiego:

http://wiki.codeblocks.org/index.php?title=BoostWindowsQuickRef

Fajnie wyjaśniona instalacja boosta pod Coda. Głupio tylko z ostrożności zapytam -
bjam --toolset=gcc "--prefix=<installpath>" install
installpath - co to takiego ? Dowolny folder instalacyjny, z którego potem będzie czerpał sobie Code jak go podepnę, czy musi to być folder z Codem ? Bo przy opisie instalacji boosta pod Deva pisało, że należy podać ścieżkę Deva , ale robiłem to takim sposobem
bjam.exe "-sMINGW_ROOT_DIRECTORY=C:\Dev-Cpp" "-sTOOLS=mingw" install
Na jedno chyba wychodzi - w sensie, że -sMINGW_ROOT_DIRECTORY ma to samo znaczenie co --prefix.

Próbowałem podpiąć ten kompilator, który już zawierał boosta, ale nie chciało skompilować pisząc, że nie potrafi czegoś znaleźć .. nie pamietam czego, ale stwierdziłem, że zrobił się za duży chlew, więc wszystko wyrzuciłem i spróbuje zainstalować boosta pierwszym sposobem - jak się nie uda, to jeszcze posiedze nad zewnętrznym MinGWem.

Tylko jak usunąć wszelkie informacje jakie zapamiętał sobie Code metodą inną niż reinstalacja systemu ? :] W dodatku dysk twardy padł, podpiąłem nowy (bardziej inny niż nowy :]), który chodzi jak kosiarka i w zasadzie błaga o litość, więc wszelkie majsterkowanie w postaci instalowania systemów byłoby silnie niewskazane. Zwłaszcza, że los nie chce, żebym skończył to co robię i na pewno padnie drugi dysk. A instalacja boosta dalej pozostanie tajemnicą :]

0

Ha ! Skompilowało. Pierwsza rzecz - zmieniłem ścieżkę do kompilatora na ponownie zainstalowanego MinGWa, ale nie chwytał. Powód - poniżej były jeszcze pliki exe, które nie odpowiadały nazwom tych z nowego MinGW. No i zaczęło kompilować, ale jeszcze nie pliki z wykorzystaniem boosta. Więc trzeba postępować wg tego co piszą tutaj:

http://wiki.codeblocks.org/index.php?title=BoostWindowsQuickRef

Ale problem pojawił się przy boost_filesystem-mgw44-mt-1_42 ... wpisałem początkowo boost_thread-mgw45-mt-1_43 (bo taka jest wersja boosta i MinGW z tej dystrybucji na nuwen.net), ale nie potrafiło tego przeczytać, więc poszukałem pliku w katalogu lib w MinGW, który mógłby być za to odpowiedzialny i znalazłem libboost_thread.a. Udostępniłem ścieżkę w Link libraries i się skompilowało bezbłędnie ha ! Ale jeszcze nie wiem jak działa program. Na razie dobrze, że się kompiluje.

W powyższym linku trzeba jeszcze sobie pozmieniać ścieżki do boosta, bo są w MinGW i bazowym folderem będzie C:\MinGW.

Spróbuje teraz zassać Coda razem z MinGWem i zainstalować samego boosta.

0

Niech ktoś spróbuje odpalić ten program - przy poprawnie zainstalowanym booście działa ?

#include <cstdlib>
#include <iostream>
#include <boost/thread.hpp>

using namespace std;

int result;
int x = 1, y = 0;
int f1Counter = 0, p2Counter = 0, max_c = 5;

void thread111(void);
void thread112(void);
void thread11(void);
void thread12(void);
void thread1(void);
void thread2(void);
void thread3(void);
void thread4(void);
void thread5(void);

int f1(int, int);
int p2(int, int);

int f1(int x, int y){
    cout << "F1" << endl;
    if(f1Counter < max_c)
    {
        f1Counter++;
        cout << "F1 passed " << f1Counter << " time" << endl;
        boost::thread my_thread4(&thread4);
    }
	return result;
}

int p2(int x, int y){
    cout << "P2" << endl;
    if(p2Counter < max_c)
    {
        p2Counter++;
        cout << "P2 passed " << p2Counter << " time" << endl;
        boost::thread my_thread5(&thread5);
    }
	return result;
}

void thread111(){
    cout << "T111" << endl;
	f1(x, y);
}

void thread112(){
    cout << "T112" << endl;
}

void thread11(){
    cout << "T11" << endl;
	if(1 > 0){
	    cout << "Wh_T11" << endl;
		boost::thread my_thread111(&thread111);
	}

	boost::thread my_thread112(&thread112);
}

void thread12(){
    cout << "T12" << endl;
}

void thread1(){
    cout << "T1" << endl;
	boost::thread my_thread11(&thread11);

	if(1 > 0){
		boost::thread my_thread12(&thread12);
	}
}

void thread2(){
    cout << "T2_of_whm" << endl;
	p2(x, y);
}

void thread3(){
     cout << "T3" << endl;
}


void thread4(){
    cout << "T4" << endl;
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	p2(x, y);
}

void thread5(){
    cout << "T5" << endl;
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	f1(x, y);
}

int main(){

	boost::thread my_thread1(&thread1);

	while(x >= y){
	    cout << "Wh_main" << endl;
	    y++;
		boost::thread my_thread2(&thread2);
	}

	boost::thread my_thread3(&thread3);

	return 0;
}
0

Poniżej kolejny przykładowy program. Dobrze używam sleepa ? Gdzieś czytałem, że taki sleep usypia wszystkie wątki, a chciałbym uśpić jeden na 100ms, żeby było widoczne na konsoli działanie reszty wątków.

#include <iostream>
#include <boost/thread/thread.hpp>

using namespace std;

void thread1(void);
void thread2(void);
void thread3(void);

void thread1(){
    cout << "T1" << endl;
	boost::thread my_thread2(&thread2);
	boost::thread my_thread3(&thread3);
}

void thread2(){
    for(int i = 0; i < 8; i++)
    {
        cout << "T2" << endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    }
}

void thread3(){
    for(int i = 0; i < 8; i++)
    {
        cout << "T3" << endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    }
}

int main()
{
    cout << "Begin!" << endl;
    boost::thread my_thread1(&thread1);
    cout << "End!" << endl;
    return 0;
}
0

Świętowit - instalowałeś ten "twój" kompilator ? Wiesz gdzie tam są includy i biblioteki odpowiedzialne za thready ? W katalogu lib jest tylko jeden plik, który zawiera nazwę thread, więc to pewnie ten. Ale kiedy instaluje boosta osobno pod MinGW, który ściągnąłem razem z Code::Blocks, to tam pojawiają się 4 biblioteki związane z threadami. Może to jest jakoś wpakowane w tym instalowanym osobno MinGW w pliku libboost_thread.a. A co z includami ? Próbowałem różnych sposobów i chociaż teoretycznie kompiluje to działanie jest dziwne. Nie wypisuje nic, choć działanie programu jest zakończone poprawnie. A w przypadku instalacji boosta pod MinGW, który już był jest wszystko ok - wypisuje w tym drugim programie Begin i End (nie do końca na to liczyłem, ale przynajmniej coś wypisuje i uruchamia maina). Poza tym który z plików w "twoim" MinGW to debugger ? Bo bez tego nie da się debuggować.

0

Mam nadzieję, że uzyskam odpowiedzi na wszystko o co pytam. A teraz kolejna ciekawostka - uruchomiłem kolejny raz powyższy program z 3ma threadami i wypisało.

Begin!
End!
T1

a po raz kolejny już bez T1

Nie rozumiem działania tych threadów - co napisałem źle ?

0

Poprawiłem i wszystko działa pięknie i bez zarzutu.

Poniżej program do testowania świeżo zainstalowanego boosta (więc to nie oftop :]):

#include <iostream>
#include <boost/thread/thread.hpp>

using namespace std;

void thread1(void);
void thread2(void);
void thread3(void);

void thread1(){
    cout << "T1" << endl;

    boost::thread my_thread2(&thread2);
    boost::thread my_thread3(&thread3);
}

void thread2(){

    for(int i = 0; i < 8; i++)
    {
        cout << "T2" << endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    }
}

void thread3(){
    for(int i = 0; i < 8; i++)
    {
        cout << "T3" << endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    }
}

int main()
{
    cout << "Begin!" << endl;

    boost::thread my_thread1(&thread1);
    boost::this_thread::sleep(boost::posix_time::milliseconds(10000));
    cout << "End!" << endl;
    return 0;
}

0

I mimo tematu - jak by ktoś potrzebował boosta pod Visual Studio to

http://illusion3d.wordpress.com/2009/05/23/boost-na-visual-studio-2008-czesc-1-instalacja/

Instalator :).

0

Świętowit - jak podpiąć pod Code::Blocks ten kompilator z http://nuwen.net/mingw.html#install ? Spróbuj to u siebie zrobić i przetestuj korzystając z mojego kodu. Kod się kompiluje, ale nie chce się uruchomić - w sensie, że wynik jest taki:

Process returned 0 (0x0)   execution time : 0.000 s
Press any key to continue.

Jak instaluje boosta osobno, to działa. Ale kiedy próbuje podpiąć MinGW z zainstalowanym boostem to nie działa.

W "Compiler and debugger..." ustawiam odpowiedni kompilator.
Global variables ma w polu "base" ścieżkę C:\MinGW\ , a w "include" C:\MinGW\include
W Build options mojego projektu - Search directories $(#boost.include), próbowałem nawet $(#boost.include)\boost
W linkerze $(#boost.lib)
A w Linker settings uznałem, że skoro nie działa libboost_thread.a to podepnę wszystkie libboost*.a

Wynik ten sam. Spróbuj uruchomić, albo podaj link, gdzie jest opisane jak to podpiąć, bo ja już nie mam pojęcia.

0

Kod się kompiluje, ale nie chce się uruchomić - w sensie, że wynik jest taki

clean & rebuild - czy powstaje exec?
jesli tak - to znaczy ze kompilator jest podpiety poprawnie, ale masz zle ustawione opcje odpalania programu do debugu.. np. stara sciezke docelowa wpisana itp
jesli nie - fakt - dziwne.. ale zeby tak bez zadnego bledu i od razu process exit 0 ? przy blednych sciezkach do bibliotek czy zlych opcjach kompilatora spodziewalbym sie ze mingw walnie jakims komunikatem.. mi to wyglada troche tak, jakby CB probowal odpalic "nic" zamiast mingw... ale CB nie uzywam.. takie luzne mysli mi sie nasuwaja

ps. libboost_thread.a/lib/.. powinno wystarczyc

1 użytkowników online, w tym zalogowanych: 0, gości: 1