我在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有谁知道如何解决这个问题?
答案 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
)