mingw中的libpthread没有找到库

时间:2011-06-26 07:17:44

标签: pthreads mingw

我正在尝试使用mingw编译以下程序:

#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <iostream>
#include <cstdio>

void *hello(void *id) {
  int nid = *static_cast<int*>(id);
  std::printf("Hello from thread %d\n", nid);
  return 0;
}

int main(int argc, char **argv) {
  pthread_t ids[2];
  int *params[2];
  for (int i = 0; i < 2; ++i) {
    params[i] = new int;
    *params[i] = i;
    pthread_create(&ids[i], 0, hello, params[i]);
  }
  for (int i = 0; i < 2; ++i)
    pthread_join(ids[i], 0);
  for (int i = 0; i < 2; ++i)
    delete params[i];
  return 0;
}

使用此命令:

g++ -lpthread -ohello.exe hello.cc

我收到以下消息:

C:\Users\XXXXXX~1\AppData\Local\Temp\cczPlv0w.o:hello.cc:(.text+0xad): undefined 
reference to `_imp__pthread_create'
C:\Users\XXXXXX~1\AppData\Local\Temp\cczPlv0w.o:hello.cc:(.text+0xe9): undefined 
reference to `_imp__pthread_join'
collect2: ld returned 1 exit status

但是使用较旧版本的MingGW,运行pthreads程序没有问题。 (这只是失败的所有程序的简单,但基本上所有使用pthreads的程序都会出现相同的错误,C和C ++)

2 个答案:

答案 0 :(得分:9)

-lpthread移至该命令的末尾:

g++ -ohello.exe hello.cc -lpthread

参数的顺序很重要。 (实际上建议使用-pthread而不是-lpthread进行链接,因为它为预处理器和链接器设置了标记。)

答案 1 :(得分:3)

库规范与gcc位置相关,它只会在列出库的位置引入未解析的符号。

由于此时尚未列出主对象文件,因此唯一未解析的符号为main。您需要将库规范移动到成为可以满足的未解析符号的位置。

我从未真正理解为什么gcc选择此路径,因为它有时会导致您不得不多次列出库(例如循环依赖项)。我曾经想到的唯一原因是要控制哪些库可以解析特定的符号。

我已经看到了更多“智能”链接器,他们只是将所有库直接批处理直到最后再经过它们,直到所有符号都满足或者没有可能存在。这节省了很多精力,但是你会失去上述控制权。