3

我以前用mac写过一些C程序,但现在不行了。
我必须使用旧的 Windows 笔记本电脑一段时间。

我安装了代码块并使用 Pthreads 测试了一个简单的程序。不幸的是,它没有用。

  pthread_create(&thrd1, NULL, thread_execute, (void *)t);

它一直说未定义的引用_imp__pthread_create

我该如何解决?

4

4 回答 4

2

您需要获取pthreads-win32,因为 pthreads 是 Unix 组件而不是 Windows 组件。

于 2011-09-24T22:22:52.730 回答
2

您显然已经获得了适用于 Windows 的 pthreads 版本。您只是没有在链接器设置中包含 .lib 文件。这样做,你应该是金色的。

于 2011-09-24T22:24:16.327 回答
2

如果您使用的是 MinGW,您可以使用 MinGW 安装管理器并安装需要执行 pthread 和 openmp 相关任务的包。这是程序。

打开安装管理器后,转到所有包并选择使用 mingw32-pthreads-w32 命名的选择包并选择它们进行安装。

然后转到安装 -> 应用更改以安装新软件包。您可以在 c 或 c++ 程序中使用 pthread.h 和 omp.h 没有任何问题。

于 2020-04-28T08:15:34.050 回答
0

此代码在 Windows 上的 MSYS2 终端中运行良好。
您需要做的就是安装gcc. (见下文。)

//  hello.c
#include <omp.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *print_hello(void *thrd_nr) {
  printf("Hello World. - It's me, thread #%ld\n", (long)thrd_nr);
  pthread_exit(NULL);
}

int main(int argc, char *argv[]) {
  printf(" Hello C code!\n");
  const int NR_THRDS = omp_get_max_threads();
  pthread_t threads[NR_THRDS];
  for(int t=0;t<NR_THRDS;t++) {
    printf("In main: creating thread %d\n", t);
    pthread_create(&threads[t], NULL, print_hello, (void *)(long)t);
  }
  for(int t=0;t<NR_THRDS;t++) {
    pthread_join(threads[t], NULL);
  }
  printf("After join: I am always last. Byebye!\n");
  return EXIT_SUCCESS;
}

编译运行如下:

gcc -fopenmp -pthread hello.c && ./a.out # Linux
gcc -fopenmp -pthread hello.c && ./a.exe # MSYS2, Windows

如您所见,Linux 和 Windows 上的 MSYS2 之间的唯一区别是可执行二进制文件的名称。其他一切都是一样的。我倾向于将 MSYS2 视为 Windows 上的模拟 (Arch-)Linux 终端。

gcc在 MSYS2 中安装:

yes | pacman -Syu gcc

期望输出类似于:

 Hello C code!
In main: creating thread 0
Hello World. - It's me, thread #0
In main: creating thread 1
Hello World. - It's me, thread #1
After join: I am always last. Bye-bye!

参考

于 2020-11-29T15:33:51.627 回答