CodeBlocks und boost (vor allem boost::thread)



  • Tach,

    wie schon in meinem anderen Thread angedeutet, habe ich zwar nun erfolgreich boost für MinGW erstellen können, aber jetzt will es immernoch nicht so ganz funktionieren.
    Da dies nun ein etwas anderes Problem als in meinem vorherigen Thread ist, mache ich einen neuen dafür auf.

    Um mich mit boost::thread genauer zu beschäftigen, habe ich also nun boost erstellt und wollte folgenden Code aus einem Tutorial in einem neuen Codeblocks-Projekt mit MinGW (neueste Version) unter Win7 Prof 32bit kompilieren:

    //main.cpp
    #include <iostream>
    #include <boost/thread.hpp>
    #include <boost/date_time.hpp>
    
    void workerFunc()
    {
    	boost::posix_time::seconds workTime(3);
    
    	std::cout << "Worker: running" << std::endl;
    
    	// Pretend to do something useful...
    	boost::this_thread::sleep(workTime);
    
    	std::cout << "Worker: finished" << std::endl;
    }
    
    int main(int argc, char* argv[])
    {
    	std::cout << "main: startup" << std::endl;
    
    	boost::thread workerThread(workerFunc);
    
    	std::cout << "main: waiting for thread" << std::endl;
    
    	workerThread.join();
    
    	std::cout << "main: done" << std::endl;
    
    	return 0;
    }
    

    Kompilieren tut das Ganze wunderbar, doch beim Linken scheiterts.

    Als Projekteinstellungen habe ich natürlich als zusätzliches include-Verzeichnis mein boost-include-Verzeichnis angegeben und als zusäztliches Linkerverzeichnis mein boost-lib-Verzeichnis.
    Als zusätzliche Libraries habe ich in der Debug-Konfiguration die Lib "libboost_thread-mgw45-mt-d-1_46.a" und entsprechend in der Release-Konfig "libboost_thread-mgw45-mt-1_46.a" eingetragen.

    Dennoch bekomme ich beim Linken folgende Fehler an den Kopf geworfen:

    ||=== BoostTest, Debug ===|
    obj\Debug\main.o||In function main':| L:\\C++\\BoostTest\\main.cpp|25|undefined reference to_imp___ZN5boost6thread4joinEv'|
    L:\C++\BoostTest\main.cpp|21|undefined reference to \_imp\_\_\_ZN5boost6threadD1Ev'| L:\\C++\\BoostTest\\main.cpp|21|undefined reference to_imp___ZN5boost6threadD1Ev'|
    obj\Debug\main.o:L:\C++\BoostTest\..\boost\include\boost-1_46\boost\thread\win32\thread_data.hpp|161|undefined reference to \_imp\_\_\_ZN5boost11this\_thread18interruptible\_waitEPvNS_6detail7timeoutE'| obj\\Debug\\main.o||In functionthread<void (*)()>':|
    L:\C++\BoostTest\..\boost\include\boost-1_46\boost\thread\detail\thread.hpp|204|undefined reference to `_imp___ZN5boost6thread12start_threadEv'|
    ||=== Build finished: 5 errors, 0 warnings (0 minutes, 3 seconds) ===|

    Sieht für mich schwer nach einer fehlenden Lib aus, aber da in keinem der boost-Tutorials, die ich bisher gelesen habe, beschrieben wird, was genau ich wann wie linken muss, habe ich keine Ahnung was ich vergessen hab 😞



  • Ich hatte dieses Problem auch. Nach etwas googlen habe ich herausgefunden, dass man, bevor man boost/thread.hpp inkludiert, BOOST_THREAD_USE_LIB definieren muss.
    Der Anfag des Programms sieht also so aus:

    #define BOOST_THREAD_USE_LIB
    #include <iostream>
    #include <boost/thread.hpp>
    #include <boost/date_time.hpp>
    


  • Danke vielmals, das war das Problem.
    Wieso die das bloß nirgends erwähnen, nicht mal auf der boost::thread-Seite (vllt hab ichs auch einfach überlesen).

    Was versucht er denn ohne den define-Wert zu machen? Versucht er dann eine dll zu nutzen?



  • Keine Ahnung 🙂 Ich hatte einfach das gleiche Problem und hab danach gegooglet. Ich glaube in der config.hpp (boost\thread\detail\config.hpp) steht dazu irgendwas drin...


Log in to reply