QT mit Asio(ohne Boost) benutzen



  • Hallo,

    möglicherweise gehört das auch ins QT-Forum, bin mir leider nicht sicher.
    Folgendes:

    Für meine derzeitige Programmiertätigkeit würde ich gerne Asio zum nutzen von Sockets verwenden. IDE ist QT und in dieser habe ich testweise folgendes Tutorial eingefügt:
    http://think-async.com/Asio/asio-1.4.8/doc/asio/tutorial/tutdaytime1.html

    Wenn ich das kompiliere erhalte ich folgende Fehler:

    18:08:16: Führe Build-Schritte für Projekt boost_test aus...
    18:08:16: Unveränderte Konfiguration, qmake-Schritt wird übersprungen.
    18:08:16: Starte "/usr/bin/make" -w
    make: Entering directory /home/hinrichs/project/tmp/Testfolder/Boost/boost_test' g++ -Wl,-O1 -Wl,-rpath,/prog/qt/QtSDK/Desktop/Qt/4.8.1/gcc/lib -o boost_test main.o main.o: In functionasio::detail::tss_ptr<asio::detail::call_stackasio::detail::task\_io\_service::context>::~tss_ptr()':
    make: Leaving directory /home/hinrichs/project/tmp/Testfolder/Boost/boost_test' main.cpp:(.text.\_ZN4asio6detail7tss\_ptrINS0\_10call\_stackINS0\_15task\_io\_serviceEE7contextEED2Ev[\_ZN4asio6detail7tss\_ptrINS0\_10call\_stackINS0\_15task\_io\_serviceEE7contextEED5Ev]+0x3): undefined reference topthread_key_delete'
    main.o: In function asio::detail::tss\_ptr<asio::detail::call\_stack<asio::detail::strand\_service::strand\_impl>::context>::~tss_ptr()': main.cpp:(.text.\_ZN4asio6detail7tss\_ptrINS0\_10call\_stackINS0\_14strand\_service11strand\_implEE7contextEED2Ev[\_ZN4asio6detail7tss\_ptrINS0\_10call\_stackINS0\_14strand\_service11strand\_implEE7contextEED5Ev]+0x3): undefined reference topthread_key_delete'
    main.o: In function asio::ip::resolver\_service<asio::ip::tcp>::shutdown\_service()': main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEE16shutdown\_serviceEv[asio::ip::resolver\_service<asio::ip::tcp>::shutdown\_service()]+0x137): undefined reference topthread_join'
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEE16shutdown_serviceEv[asio::ip::resolver_serviceasio::ip::tcp::shutdown_service()]+0x153): undefined reference to pthread_detach' main.o: In functionasio::detail::posix_tss_ptr_create(unsigned int&)':
    main.cpp:(.text._ZN4asio6detail20posix_tss_ptr_createERj[asio::detail::posix_tss_ptr_create(unsigned int&)]+0x8): undefined reference to pthread\_key_create' main.o: In functionasio::ip::resolver_serviceasio::ip::tcp::fork_service(asio::io_service::fork_event)':
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEE12fork_serviceENS_10io_service10fork_eventE[asio::ip::resolver_serviceasio::ip::tcp::fork_service(asio::io_service::fork_event)]+0x8f): undefined reference to pthread\_create' main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEE12fork\_serviceENS\_10io\_service10fork\_eventE[asio::ip::resolver\_service<asio::ip::tcp>::fork\_service(asio::io\_service::fork\_event)]+0x119): undefined reference topthread_join'
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEE12fork_serviceENS_10io_service10fork_eventE[asio::ip::resolver_serviceasio::ip::tcp::fork_service(asio::io_service::fork_event)]+0x129): undefined reference to pthread\_detach' main.o: In functionasio::detail::task_io_service::run(asio::error_code&)':
    main.cpp:(.text._ZN4asio6detail15task_io_service3runERNS_10error_codeE[asio::detail::task_io_service::run(asio::error_code&)]+0x41): undefined reference to pthread_getspecific' main.cpp:(.text.\_ZN4asio6detail15task\_io\_service3runERNS\_10error\_codeE[asio::detail::task\_io\_service::run(asio::error\_code&)]+0x56): undefined reference topthread_setspecific'
    main.cpp:(.text._ZN4asio6detail15task_io_service3runERNS_10error_codeE[asio::detail::task_io_service::run(asio::error_code&)]+0x375): undefined reference to pthread_setspecific' main.cpp:(.text.\_ZN4asio6detail15task\_io\_service3runERNS\_10error\_codeE[asio::detail::task\_io\_service::run(asio::error\_code&)]+0x601): undefined reference topthread_setspecific'
    main.o: In function asio::ip::resolver\_service<asio::ip::tcp>::~resolver\_service()': main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED2Ev[\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED5Ev]+0x1a9): undefined reference topthread_detach'
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEED2Ev[_ZN4asio2ip16resolver_serviceINS0_3tcpEED5Ev]+0x1b6): undefined reference to pthread_join' main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED2Ev[\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED5Ev]+0x1d9): undefined reference topthread_detach'
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEED2Ev[_ZN4asio2ip16resolver_serviceINS0_3tcpEED5Ev]+0x22c): undefined reference to pthread_detach' main.o: In functionasio::ip::resolver_serviceasio::ip::tcp::~resolver_service()':
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEED0Ev[_ZN4asio2ip16resolver_serviceINS0_3tcpEED5Ev]+0x1b9): undefined reference to pthread_detach' main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED0Ev[\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED5Ev]+0x1c6): undefined reference topthread_join'
    main.cpp:(.text._ZN4asio2ip16resolver_serviceINS0_3tcpEED0Ev[_ZN4asio2ip16resolver_serviceINS0_3tcpEED5Ev]+0x1e9): undefined reference to pthread_detach' main.cpp:(.text.\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED0Ev[\_ZN4asio2ip16resolver\_serviceINS0\_3tcpEED5Ev]+0x23c): undefined reference topthread_detach'

    Das ist ja ein Linker-Fehler, allerdings weiß ich nicht welche Library ich denn verlinken muss und wie ich das genau bei QT mache, musste das dort noch nie OO

    Nutze Linux mit QT und als Compiler g++(kA welche Version)

    wäre sehr dankbar über jede Hilfe 🙂



  • du musst noch gegen die pthread lib linken.



  • vielen dank. Ich gehe richtig in der Annahme, dass ich pthread aus den boost header/source dateien builden muss, ja?(sorry, bin neu im umgang mit boost)



  • Ne, übergib dem GCC einfach "-pthread".



  • das habe ich jetzt schon mehrfach gelesen, jedoch weiß ich nicht wie ich das via QT tue(der compiler wird ja für mich aufgerufen).



  • Hmm, ich meine ich habe jetzt via
    "QMAKE_CXXFLAGS +=-pthread" die compilerflag hinzugefügt, jedoch erhalte ich nachwievor den gleichen Fehler(siehe oben).
    Wenn ich jedoch über die "bibliothek hinzufügen" option von QT die boost thread (gibt keine spezielle pthread lib OO) lib adde erhalte ich folgende Fehler:

    Ist mir fast wieder zu aufwendig das zu benutzen... 😕

    http://up.picr.de/12701004xx.jpg

    Danke für eure Hilfe 🙂



  • pthread != boost::thread

    pthread = Posix thread bibliothek
    Posix: http://de.wikipedia.org/wiki/Portable_Operating_System_Interface

    boost hat nen ganz anderen Background.
    Aber es kann durchaus sein, das boost::thread in seiner linux implementation die pthread nutzt.

    kenn mich mit qmake ned so aus, aber:
    "QMAKE_CXXFLAGS +=-pthread"
    kann definitiv nicht alles sein ^^

    Bibliothen linkt man .... dementsprechend muss das -pthread nicht in den Compilerflags (CXX ist c++ compiler flag) stehen sondern du musst dem linker das mitteilen Also dem linker ld muss am ende das -lpthread mitgegeben werden. keine Ahnung wie mann das mit qmake macht ^^
    mit cmake wuerd ich dir helfen koennen

    Ciao ...



  • -pthread aktiviert Support für pthread und linkt logischerweise auch die Bibliotheken rein.

    Er kann es ja mal mit -lpthread probieren, aber -pthread sollte reichen.


Anmelden zum Antworten