Boost::thread



  • Hallo,
    ich habe das Beispiel aus einem Buch:

    #include <iostream>
    #include <boost/thread.hpp>
    using namespace std;
    
    void f(int t){
        boost::this_thread::sleep(boost::posix_time::seconds(t));
        cout << "Thread" << boost::this_thread::get_id()<<" : Funktion beendet! Laufzeit = " << t << " s"<<endl;
    }
    int main() {
        boost::thread t1(f,4);
        boost::thread t2(f,6);
        boost::thread t3(f,2);
        cout << "t1.get_id(): " << t1.get_id() << endl;
        cout << "t2.get_id(): " << t2.get_id() << endl;
        cout << "t3.get_id(): " << t3.get_id() << endl;
        t1.join();
        t2.join();
        t3.join();
        cout << "main() ist beendet" << endl;
        return (0);
    }
    

    Allerdings bekomme ich da Fehler:

    Undefined symbols:
      "vtable for boost::detail::thread_data_base", referenced from:
          __ZTVN5boost6detail16thread_data_baseE$non_lazy_ptr in main.o
      "boost::thread::join()", referenced from:
          _main in main.o
          _main in main.o
          _main in main.o
      "boost::this_thread::sleep(boost::posix_time::ptime const&)", referenced from:
          void boost::this_thread::sleep<boost::posix_time::seconds>(boost::posix_time::seconds const&)in main.o
      "boost::thread::get_id() const", referenced from:
          _main in main.o
          _main in main.o
          _main in main.o
      "boost::thread::~thread()", referenced from:
          _main in main.o
          _main in main.o
          _main in main.o
          _main in main.o
          _main in main.o
          _main in main.o
      "boost::this_thread::get_id()", referenced from:
          f(int) in main.o
      "typeinfo for boost::detail::thread_data_base", referenced from:
          typeinfo for boost::detail::thread_data<boost::_bi::bind_t<void, void (*)(int), boost::_bi::list1<boost::_bi::value<int> > > >in main.o
      "boost::detail::thread_data_base::~thread_data_base()", referenced from:
          boost::detail::thread_data<boost::_bi::bind_t<void, void (*)(int), boost::_bi::list1<boost::_bi::value<int> > > >::~thread_data()in main.o
          boost::detail::thread_data<boost::_bi::bind_t<void, void (*)(int), boost::_bi::list1<boost::_bi::value<int> > > >::~thread_data()in main.o
      "boost::thread::start_thread()", referenced from:
          boost::thread::thread<void (*)(int), int>(void (*)(int), int)in main.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    make[2]: *** [dist/Debug/GNU-MacOSX/cppapplication_1] Error 1
    make[1]: *** [.build-conf] Error 2
    make: *** [.build-impl] Error 2
    

    Kann sich das einer erklären?



  • Thomas22 schrieb:

    Kann sich das einer erklären?

    Klar, du musst noch gegen die libboost_thread linken. Im Gegensatz zu vielen Sachen in boost ist boost.thread keine reine Header-Bibliothek.



  • Ok. Jetzt gehts. Ich hatte vorher das Lib Verzeichnis angegeben, warum reicht das denn nicht zu. Also das, /lib wo die bosst libs drin sind. Warum reicht das denn nicht?


  • Mod

    Thomas22 schrieb:

    Ok. Jetzt gehts. Ich hatte vorher das Lib Verzeichnis angegeben, warum reicht das denn nicht zu. Also das, /lib wo die bosst libs drin sind. Warum reicht das denn nicht?

    Nur weil der Linker eine Bibliothek finden kann, heißt das noch nicht, dass auch dagegen gelinkt wird. Dein Linker dürfte Hunderte oder sogar Tausende von verschiedenen Bibliotheken in seinen Suchpfaden haben. Soll der die alle nach einem passenden Symbol durchsuchen? Was meinst du wieviele Symbole in all den Bibliotheken mehrfach vorkommen? Welches soll dann das richtige sein?


Anmelden zum Antworten