尝试在Ubuntu上使用pthread时出错

时间:2013-04-23 11:29:16

标签: c++ gcc g++ pthreads

我正在阅读有关C ++中线程的教程,并测试了以下代码:

#include <iostream>
#include <pthread.h>
#include <cstdlib>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                      PrintHello, &threads[i]);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

我尝试使用gcc和g ++编译此代码,但我总是遇到编译错误。

使用gcc -pthread thread_test.c:

  

/tmp/ccmpQLyp.o:在函数PrintHello(void*)': thread_test.cpp:(.text+0x1a): undefined reference to std :: cout'中   thread_test.cpp :(。text + 0x1f):对std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' thread_test.cpp:(.text+0x2e): undefined reference to std :: ostream :: operator&lt;&lt;(long)'的未定义引用   thread_test.cpp :(。text + 0x33):未定义引用std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' thread_test.cpp:(.text+0x3b): undefined reference to std :: ostream :: operator&lt;&lt;(std :: ostream&amp;(*)(std :: ostream&amp;))'   /tmp/ccmpQLyp.o:在函数main': thread_test.cpp:(.text+0x63): undefined reference to std :: cout'中   thread_test.cpp :(。text + 0x68):未定义引用std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' thread_test.cpp:(.text+0x75): undefined reference to std :: ostream :: operator&lt;&lt;(int)'   thread_test.cpp :(。text + 0x7a):未定义引用std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' thread_test.cpp:(.text+0x82): undefined reference to std :: ostream :: operator&lt;&lt;(std :: ostream&amp;(*)(std :: ostream&amp;))'   thread_test.cpp :(。text + 0xcc):未定义引用std::cout' thread_test.cpp:(.text+0xd1): undefined reference to std :: basic_ostream&gt;&amp;的std ::运营商LT;&LT; &gt;(std :: basic_ostream&gt;&amp;,char const *)'   thread_test.cpp :(。text + 0xde):未定义引用std::ostream::operator<<(int)' thread_test.cpp:(.text+0xe3): undefined reference to std :: basic_ostream&gt;&amp; std :: endl&gt;(std :: basic_ostream&gt;&amp;)'   thread_test.cpp :(。text + 0xeb):对std::ostream::operator<<(std::ostream& (*)(std::ostream&))' /tmp/ccmpQLyp.o: In function __ static_initialization_and_destruction_0(int,int)'的未定义引用:   thread_test.cpp :(。text + 0x141):未定义引用std::ios_base::Init::Init()' thread_test.cpp:(.text+0x150): undefined reference to std :: ios_base :: Init :: ~Init()'   /tmp/ccmpQLyp.o:(.eh_frame+0x47):对__gxx_personality_v0'的未定义引用   collect2:错误:ld返回1退出状态

你能帮忙吗?我是否必须做一些事情,以便此代码在Linux和Windows上运行?

2 个答案:

答案 0 :(得分:3)

使用g++代替gcc,或手动链接-lstdc++

答案 1 :(得分:0)

对于任何在2020年阅读此书的人:

在GCC中,当针对pthread进行链接时,请勿使用“ -lpthread”,而仅使用“ -pthread” CLI选项。