undefined reference to `pthread_create' Erreur lors de la prise de C++11 application avec ASIO et std::thread

- Je configurer Eclipse (en Fait Xilinx SDK mais basé sur Eclipse), et g++4.9.2, pour compiler un projet qui utilise autonome ASIO et que j'ai utilisé-std=c++11 dans les Propriétés -> C/C++ Build -> Paramètres -> Paramètres de l'Outil -> d'Autres drapeaux de sorte qu'il peut compiler à l'aide de tous les C++11 caractéristiques.

J'ai aussi mis ASIO_HAS_STD_THREAD, ASIO_STANDALONE et ainsi de suite en C/C++ Général de Symboles, et j'espère que les ASIO-tête utilisera std::thread au lieu de pthread. Cependant, je vois encore l'Erreur de faire:

undefined reference to pthread_create, 
..asio-1.10.6\include\asio\detail\impl\posix_thread.ipp
and posix_tss_ptr.hpp

le problème est donc, depuis que je suis à l'aide de C++11, et spécifié ASIO_HAS_STD_THREAD mais pas ASIO_HAS_PTHREADS, le posix_thread.ipp ne devrait pas même être inclus (par posix_thread.hpp), en fonction de thread.php en ASIO:

#if !defined(ASIO_HAS_THREADS)
# include "asio/detail/null_thread.hpp"
#elif defined(ASIO_WINDOWS)
# if defined(UNDER_CE)
#  include "asio/detail/wince_thread.hpp"
# else
#  include "asio/detail/win_thread.hpp"
# endif
#elif defined(ASIO_HAS_PTHREADS)
# include "asio/detail/posix_thread.hpp"
#elif defined(ASIO_HAS_STD_THREAD)
# include "asio/detail/std_thread.hpp"
#else
# error Only Windows, POSIX and std::thread are supported!
#endif

Suspect 1 -pthread

Contrairement à la plupart des gens croient, C++11 n'a pas besoin de la -pthread et j'ai essayé de compiler un projet simple, sans -pthread dans Eclipse. Cependant, vous pouvez corriger moi si je me trompe. Quand j'ai mis -pthread dans l'éditeur de liens option, il ne compiler, mais je sentais que je ne veux pas le pthread si pas nécessaire.

Suspect 2 - ASIO makefile

Quand je recherche le posix_tss_ptr.php, j'ai trouvé aussi dans le Makefile.am. Je me demande si cela affecte l'erreur?

Quelle est donc la cause du problème? Si pas les deux ci-dessus suspect? J'espère que la solution peut être encore à l'aide de pur C++11 chemin, de ne pas utiliser pthread si mon raisonnement est correct.

Mise à jour

J'ai trouvé que ASIO_HAS_PTHREADS est définie non pas par moi, et c'est pourquoi ASIO utilise des threads POSIX quelque part et l'éditeur de liens doit ensuite l'option-pthread. Puis j'ai tracé jusqu'à la asio/detail/signal_blocker.php en utilisant #erreur de la directive. Il existe seulement deux lieux qu'il est défini et ils sont en ASIO config.php

#  if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS)
#   define ASIO_HAS_PTHREADS 1
#  elif defined(_POSIX_THREADS)
#   define ASIO_HAS_PTHREADS 1

ASIO encore des réponses sur les THREADS POSIX ou Windows pour signal_blocker.php indiqué ci-dessous. C'est pourquoi ASIO a encore besoin de pthread.

#if !defined(ASIO_HAS_THREADS) || defined(ASIO_WINDOWS) \
  || defined(ASIO_WINDOWS_RUNTIME) \
  || defined(__CYGWIN__) || defined(__SYMBIAN32__)
typedef null_signal_blocker signal_blocker;
#elif defined(ASIO_HAS_PTHREADS)
typedef posix_signal_blocker signal_blocker;
#endif

Et _PTHREADS est défini à partir de la gnu le compilateur croisé (bras-xilinx-linux-gnueabi) inclure des fichiers tels que des fonctionnalités.h, posix_opt.h, et etc. Je ne vais pas retracer qui a véritablement défini la macro, mais ASIO est la source qui utilise _POSIX_THREADS et donc l'option de l'éditeur de liens -pthread devrait être là.

De nouveau, non ASIO C++11 thread n'a pas besoin d'-pthread pour g++ 4.9.2 mais autonome ASIO besoins. Le code suivant est construit correctement sans -pthread dans g++4.9.2 (Xilinx SDK qui est basé sur Eclipse):

#include <thread>
void test() {
    for(int i=0;i<100;i++);
}
int main()
{
    std::thread thread1(test);
    thread1.join();
    return 0;
}

OriginalL'auteur Splash | 2016-01-21