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
Vous devez vous connecter pour publier un commentaire.
Le fait qu'un programme est écrit en C++11 n'a pas d'incidence sur avec si ou
pas besoin d'être en relation avec le
pthread
de la bibliothèque. Il a besoin de lienbibliothèque si elle nécessite des threads Posix.
C++11 présente l'
std::thread
classe et chaque conformes compilateur standardla bibliothèque doit mettre en œuvre la fonctionnalité de la classe à l'aide de certains indigènes
fils de l'API hébergé par le système cible. GCC met en œuvre à l'aide de
pthreads
,si vous ne pouvez créer un programme qui crée
std::thread
objets avecGCC, à moins que vous lier avec
-pthread
. Ce fait est sans lien avecasio
.Plus TARD
Je pense que vous vous trompez et confus par le fait que certains Windows ports de GCC
lien
libpthread
par défaut. E. g. si votre programme d'exemple est dansthread.cpp
j'pouvez réussir à construire dans Windows avec TDM-GCC 4.9.2 donc:
Mais si vous le faites en mode verbose:
vous pouvez voir qu'un grand nombre de la bibliothèque options sont passées à l'éditeur de liens
derrière les scènes, en particulier
-lpthread
:Et sur Linux, vous n'aurez pas de lien
libpthread
, sauf si vous demandez:Je reçois
undefined reference to `pthread_create'
si j'ai essayer d'utiliser std::thread sans -pthread. Vous pourriez être en mesure de s'en tirer avec l'aide de verrous depuis la glibc a un sans verrouillage talon de mise en œuvre qui obtient permutées pour les vrais lorsque vous lien libpthread.doncVoir mise à jour
Alors pourquoi l'application à l'aide ASIO peut pas être construite sans -lpthread, mais l'application sans ASIO? Même compilateur, même IDE, même options du linker.
OriginalL'auteur Mike Kinghan
Cours de l'excution de code à utiliser
g++ ssss(votre nom de code).rpc -std=c++11 -pthread
il travaillera
OriginalL'auteur Ramanand Yadav
1. std::thread n'a pas besoin d'-pthread
Voici ce que j'ai creusé à partir de l'ASIO, et permettez-moi de montrer l'exemple simple d'abord. Dans CentOS 6.5 32 bits, et dans Eclipse, à l'aide de g++4.9.3, le code suivant construit avec -std=c++11 seulement, pas besoin de le dire-lpthread
Une fois que j'ai ajouter de la tes2() dans main, il échoue avec undefined reference to `pthread_create'
2. Source de l'ASIO de la dépendance sur -pthread
Tout d'abord, il y a un code dans la version autonome d'ASIO qui utilise des threads posix, mais peut également utiliser std. L'ordre doit être réorganisé de manière à utiliser std premier lorsque les deux sont définis. Exemple de Code à partir de static_mutex.php ligne 27
Deuxième, il y a encore deux fichiers posix: signal_blocker.hpp et tss_ptr.hpp. Le faire va échouer parce que Windows et POSIX sont pris en charge
Je ne sais pas si c'est possible de réécrire complètement les deux fichiers à l'utilisation de c++11, mais ces deux fichiers sont à la source de la dépendance sur -lpthread, pas de std::thread.
mise à jour
tss_ptr.hpp
stipule que siASIO_HAS_THREAD_KEYWORD_EXTENSION
est défini, il n'a pas besoin pthread. Après j'ai défini ce dans les symboles, les erreurs a diminué de moitié, en indiquant, seul lesignal_blocker.hpp
est la source de cette dépendance.affecte signal_set_service.ipp
et select_reactor.ipp
-std=c++11
. L'option-std=c++11
n'a été introduite dans g++ 4.7. Il est rejeté par g++ 4.5.3. Live exemple: goo.gl/7Gmmlx posté lemain
programme ne compile pas avec n'importe quel compilateur C++ ou toutes les options. Pour rendre votre point de vue vous avez besoin de poster des exemples de programmes qui permettront de compiler et un lien (ou pas) comme l'a écrit, sur le système d'exploitation que vous spécifiez, avec le compilateur de la version que vous spécifiez, avec le verbatim compiler et lier commandlines que vous spécifiez.désolé, faute de frappe, 4.9.3
goo.gl/YN85G3
Merci, c'est utile. Expérience en commentant toutes les lignes qui se rapportent à
pthreads_create
(3,13,14,15). Compiler lien et de l'exécuter. Vous verrez:terminate called after throwing an instance of 'std::system_error' what(): Enable multithreading to use std::thread: Operation not permitted Aborted (core dumped)
. Pour résoudre ce problème, rétablir le lien avec-pthread
.Je vous remercie. Il peut donc compiler, mais ne pouvait pas fonctionner sans -pthread.
OriginalL'auteur Splash