如何修复对`_imp__pthread_create'的未定义引用
如何修复对`_imp__pthread_create'的未定义引用
我在Windows 7 32位系统上使用MinGW编译器。
但是我无法编译使用pthread的源代码。
我的代码如下:
#include#include 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文件。
有没有人知道如何解决这个问题?
原因:在给gcc命令行添加库的搜索路径时,使用了一个不是目录的路径/usr/local/lib/libpthread.dll.a。同时,代码中的#ifndef pthread_create部分存在逻辑错误,会导致链接时找不到定义的_imp__pthread_create。
解决方法:修改命令行,将-L /usr/local/lib/libpthread.dll.a改为-lpthread,告诉链接器要链接pthread库。同时,修改代码中的#ifndef pthread_create部分,使其正确执行。
下面是修改后的代码:
#include
#include
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 -pthread
需要注意的是,在运行程序时,需要确保正确的pthreadGC??.dll位于程序加载器搜索dll的路径之一。
建议使用更现代的Windows GCC端口,如TDM-GCC或mingw-w64,它们内置了pthread支持。编译命令为:
gcc -Wall -o trylpthread.o -c trylpthread.c
链接命令为:
gcc -o trylpthread.exe trylpthread.o -pthread