如何修复`_imp__pthread_create'的未定义引用

时间:2015-11-28 06:03:53

标签: gcc linker pthreads mingw

我在Windows7 32bit上使用MinGW。 我无法编译使用pthread的源代码。

我的代码如下。

#include <stdio.h>
#include <pthread.h>

int main(int argc, char** argv)
{
  (void)argv;
  printf("######## start \n");
#ifndef pthread_create
  return ((int*)(&pthread_create))[argc];
#else
  (void)argc;
  return 0;
#endif
}

编译时发生错误。

gcc -I /usr/local/include -L /usr/local/lib/libpthread.dll.a trylpthread.c
C:\Users\xxx\AppData\Local\Temp\cc9OVt5b.o:trylpthread.c:(.text+0x25): undefined reference to `_imp__pthread_create'
collect2.exe: error: ld returned 1 exit status

我使用以下pthread库。

pthreads-w32-2.8.0-3-mingw32-dev

这是/ usr / local / lib

中的libpthread.dll.a

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

命令行:

gcc -I /usr/local/include -L /usr/local/lib/libpthread.dll.a trylpthread.c

没有意义。

-L <dir>是一个链接器选项,用于指示链接器搜索所需的库 在目录<dir>中。因此,您告诉链接器在中搜索所需的库 路径/usr/local/lib/libpthread.dll.a,不是目录,而另一方面 你没有告诉链接器根本没有链接任何库。这就是它找不到的原因 _imp__pthread_create的定义。

您发布的程序也没有意义。这些行:

#ifndef pthread_create
  return ((int*)(&pthread_create))[argc];
#else
  (void)argc;
  return 0;
#endif

说: -

如果我定义了预处理器宏pthread_create,那么编译:

  return ((int*)(&pthread_create))[argc];

否则编译:

  (void)argc;
  return 0;

如果您已经定义了预处理器宏pthread_create,例如

#define pthread_create whatever

然后你要编译的代码是:

  (void)argc;
  return 0;

由于你确实没有定义任何这样的宏,你编译的代码是:

  return ((int*)(&pthread_create))[argc];
如你所见,

在联动中失败了。如果代码 编译时使用pthread_create如此定义, 它会是:

  return ((int*)(&whatever))[argc];

将您的程序改写为:

#include <stdio.h>
#include <pthread.h>

int main(int argc, char** argv)
{
  (void)argv;
  printf("######## start \n");
  return ((int*)(&pthread_create))[argc];
}

编译:

gcc -Wall -I /usr/local/include -o trylpthread.o -c trylpthread.c

链接:

gcc  -o trylpthread.exe trylpthread.o  /usr/local/lib/libpthread.dll.a

请记住,当您编译和链接程序时,相应的pthreadGC??.dll 必须在程序加载器搜索dll的其中一个地方的 runtime 中找到。

更好的是,卸载你的MinGW和你的pthreads-w32-2.8.0-3-mingw32-dev和 安装一个更新的GCC Windows端口,例如TDM-GCC(最简单)或mingw-w64。如果是Windows系统,请选择32位版本 是32位。这些工具链具有内置的pthread支持,正如GCC标准所做的那样。

编译:

gcc -Wall -o trylpthread.o -c trylpthread.c

链接:

gcc  -o trylpthread.exe trylpthread.o  -pthread

(不是-lpthread