Newsgroup: it.comp.lang.c++
Titolo: Ancora boost libraries

Ciao a tutti,
continuo a avere molti problemi con le boost libraries, sono ormai alla 
frutta e non so più dove sbattere la testa.
Possibile che le avete scompattate e tutto funziona nessun problema
tutto ok?
Ho fatto due tipi di prove:
1°
- Scaricato l'installer ( 
http://www.mingw.org/wiki/Getting_Started
 )
- Ho scaricato le boost libraries
- Ho configurato IDE (eclipse)
2°
- Ho scaricato MinGw con boost libraries
 
http://nuwen.net/mingw.html
Da quel che ho capito le fonde assieme MinGW e boost libraries assieme.
In entrambi casi questo codice qua sotto viene compilato correttamente
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
     using namespace boost::lambda;
     typedef std::istream_iterator<int> in;
     std::for_each(
         in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
Il problema nasce quando provo gli esempi per le boost.filesystem
In entrambi i casi non riesco a compilarli e continua a darmi diversi 
errori.
Eccovi il codice
#include<boost/filesystem/operations.hpp>
#include<iostream>
namespace bf = boost::filesystem;         //create an alias
int main()
{
     bf::path p("first.cpp");
     if(bf::exists(p))
         std::cout<<p.leaf()<<" exists.\n";
     else
         std::cout<<p.leaf()<<" does not exist.\n";
}
e questi sono gli errori.
**** Build of configuration Debug for project Prova08 ****
**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Prova08.o ..\src\Prova08.cpp
g++ -oProva08.exe src\Prova08.o
src\Prova08.o: In function `__static_initialization_and_destruction_0':
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:205: 
undefined reference to `boost::system::get_system_category()'
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:206: 
undefined reference to `boost::system::get_generic_category()'
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:210: 
undefined reference to `boost::system::get_generic_category()'
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:211: 
undefined reference to `boost::system::get_generic_category()'
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:212: 
undefined reference to `boost::system::get_system_category()'
src\Prova08.o: In function `error_code':
d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/system/error_code.hpp:311: 
undefined reference to `boost::system::get_system_category()'
src\Prova08.o:d:/programmi/mingw/bin/../lib/gcc/i686-pc-mingw32/4.2.1-dw2/../../../../include/boost/filesystem/operations.hpp:291: 
undefined reference to 
`boost::filesystem::detail::status_api(std::string const&, 
boost::system::error_code&)'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 2390  ms.
Sicuramente è un errore banale ma io non riesco a risolverlo.
Non so più che fare, spero nel vostro aiuto.
Grazie
Lele

 Non so piů che fare, spero nel vostro aiuto.
Devi "linkare" con la libreria "libboost_filesystem".
Alcune componenti di Boost sono "header-only"; quindi ti basta #includere
gli header giusti e ti ritrovi sia le dichiarazioni che le definizioni.
Altre richiedono il linking con la corrispondente libreria dinamica o
statica, che contiene le definizioni.
Max

 statica, che contiene le definizioni.
Questo non so ancora come farlo ma lo imparerò al più presto.
Grazie
lele


Secondo me ti conviene prima imparare a compilare da riga di comando,
con qualcosa tipo:
g++ -I<directory degli header> <sorgenti> -L<directory delle librerie>
-l<libreria>
ad esempio
g++ -I/usr/local/include/boost pippo.cpp -L/usr/local/lib/boost -
lboost_filesystem
Questo ti permettera' di capire cosa vuole l'IDE.
Ciao,
Nicola

 -l<libreria>
Ho scaricato MinGw con boost libraries
 
http://nuwen.net/mingw.html
Prove in Windows:
Primo codice:
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
     using namespace boost::lambda;
     typedef std::istream_iterator<int> in;
     std::for_each(
         in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
d:\g++ D:\Programmi\MinGW\bin Prova08.cpp
Funziona.
Quindi ho provato
d:\g++ Prova08.cpp
Funziona, il compilatore sa dove cercare.
Secondo codice:
#include<boost/filesystem/operations.hpp>
#include<iostream>
namespace bf = boost::filesystem;         //create an alias
int main()
{
     bf::path p("first.cpp");
     if(bf::exists(p))
         std::cout<<p.leaf()<<" exists.\n";
     else
         std::cout<<p.leaf()<<" does not exist.\n";
}
D:\g++ -I D:\Programmi\MinGW\bin Prova08.cpp -L D:\Programmi\MinGW\lib\ 
-l D:\Programmi\MinGW\lib\libboost_filesystem.a
e
D:\g++ -I D:\Programmi\MinGW\bin Prova08.cpp -L D:\Programmi\MinGW\lib\ 
-l libboost_filesystem.a
Risposta:
D:\Programmi\MinGW\bin/ld.exe: cannot find -llibboost_filesystem.a
collect2: ld returned 1 exit status
La libreria libboost_filesystem.a c'è onestamente non ho più idea di 
cosa fare.
Grazie
Lele


Se libboost_filesystem.a e' sotto D:\Programmi\MinGW\lib\ prova a
scrivere -lboost_filesystem (tutto attaccato) invece di -l
libboost_filesystem.a . In alternativa puoi provare a mettere
esplicitamente D:\Programmi\MinGW\lib\libboost_filesystem.a in fondo
alla linea di comando, senza l'opzione -l .
Ciao,
Nicola

Ciao Nicola Musatti,
ancora nulla. Se non hai altre idee ti ringrazio comunque per il tuo 
interesse
Cosa ne pensi se mi compilassi da solo le librerie del filesystem?
L'unico problema è che non so come fare, ho capito che bjam serve a 
quello scopo non ci sono riuscito.
Hai idee?
Grazie
lele

 
A che scopo? 
Max

Ciao Archeopteryx,
non prenderla come polemica, la mia vuol essere solo una domanda.
Perché non cambi compilatore?
Ciao
lele

 A che scopo? 
Io penso che il problema sia focalizzato qui..
Mi spiego nelle boost_libraries scaricate da qui ( 
http://downloads.sourceforge.net/boost/boost_1_36_0.7z?modtime=1218749377&big_mirror=0
)
Il file libboost_filesystem.a non era presente.
Quindi ho scaricato 
http://nuwen.net/mingw.html
 che al suo interno č 
presente libboost_filesystem.a
La mia idea era quella di "creare" un nuovo libboost_filesystem.a ormai 
sono gli ultimi tentativi prima di cambiare boost_libraries, mi rendo 
conto che sono davvero potenti ma se non posso utilizzarle.....
Grazie
Lele

 g++ prova08.cpp -D D:\Programmi\MinGW\lib -lboost_filesystem
Ok, in effetti dimenticavo una cosa: devi linkare anche con libboost_system. 
 g++ prova08.cpp -L D:\Programmi\MinGW\lib -lboost_filesystem -lboost_system
Max

 g++ prova08.cpp -L D:\Programmi\MinGW\lib -lboost_filesystem -lboost_system
!!!!!!!!FUNZIONA!!!!!!!!
Finalmente!!!! ero ormai rassegnato!!!
Adesso potrň inziare a lavorarci sopra dopo quasi 2 settimane di 
tentativi!!!
Ciao
Lele

Ciao Archeopteryx,
ti posso dire che sono bloccato con le librerie da almeno due settimane 
e non mi sono arreso, ho fatto anche altre cose come Linux ecc. Adesso 
grazie alle NG sono riuscito a risolvere parzialmente il problema, ora 
pero devo sbattere la testa per configurare Eclipse e non sarà una 
passeggiata.
Come in tutte le cose se vuoi diventare bravo dei dedicargli molto tempo 
e non scoraggiarti.
Ciao
Lele

Ciao Max M.,
domanda è corretto scrivere
g++ -I<directory degli header> <sorgenti> -L<directory delle librerie>
-l<libreria> -l<2° libreria> <- è giusto riassumere cosi?
esempio
  g++ prova08.cpp -L D:\Programmi\MinGW\lib -lboost_filesystem 
-lboost_system <- 2° libreria?
Ho scritto un post per spiegare come ho fatto a risolvere il problema
ma qui non so se è corretto riassumere cosi
Fammi sapere
Lele

 funge sotto MS).
Se il tuo obbiettivo e' studiare/giocare col C++ duro e puro ora come
ora Microsoft e' decisamente piu' avanti di Borland e secondo me lo
restera' ancora per un po'. In questo senso quindi il Visual C++ 2008
Express non ha quasi concorrenti; l'unico probabilmente e'
Code::Blocks con una versione recente di GCC, ma e' certamente piu'
macchinoso da mettere in piedi.
Se invece il Borland ti piace anche per gli aspetti proprietari,
ovvero la libreria VCL, potresti prendere in considerazione il
passaggio al Turbo C++, che e' una sorta di C++ Builder 2006
"Express": 
http://www.turboexplorer.com/cpp
Il codice si porta dal BCB6 abbastanza comodamente e la conformita'
allo standard e' un po' migliore. Anche con questo pero' non conviene
puntare ad una release di Boost troppo recente.
Ciao,
Nicola