将 C 程序与标准线程(来自 C11 的<threads.h>)链接起来的正确方法是什么?
What is proper way of linking C program with standard threads (<threads.h> from C11)?
我正在尝试学习如何在 C11 中使用,所以我尝试编译该示例:
#include <stdio.h>
#include <threads.h>
int run(void *arg)
{
printf("Hello world of C11 threads from thread %lu.\n", thrd_current());
fflush(stdout);
return 0;
}
int main()
{
thrd_t thread;
if (thrd_success != thrd_create(&thread, run, NULL))
{
perror("Error creating thread!");
return 1;
}
int result;
thrd_join(thread, &result);
printf("Thread %lu returned %d at the end\n", thread, result);
fflush(stdout);
}
问题是程序需要用额外的链接器标志编译:
$ gcc --std=c17 main.c
/usr/bin/ld: /tmp/ccEtxJ6l.o: in function `main':
main.c:(.text+0x66): undefined reference to `thrd_create'
/usr/bin/ld: main.c:(.text+0x90): undefined reference to `thrd_join'
collect2: error: ld returned 1 exit status
但是没有任何信息表明我应该使用什么标志,我注意到,使用 -lpthread
标志的编译是成功的:
$ gcc --std=c17 main.c -lpthread && ./a.out
Hello world of C11 threads from thread 140377624237824.
Thread 140377624237824 returned 0 at the end
但不代表就是正确的flag。
我正在使用 gcc:
$ gcc --version
gcc (Arch Linux 9.3.0-1) 9.3.0
请检查:
If the macro constant STDC_NO_THREADS(C11) is defined by the compiler, the header and all of the names listed here are not provided.
为什么要使用thread.h?它被认为是劣等 API。使用 pthread.h 而不是 POSIX 标准。 -lpthread 标志也用于在编译期间包含 pthread 库。
Pthread 手册页:
http://man7.org/linux/man-pages/man0/pthread.h.0p.html
如果您决定在 Linux 平台上使用 < threads.h>,您必须 link 您的程序带有 -lpthread。
例如,如果您使用的是 GCC,您会发现 join 实现 here and you will also notice that it is just a call to pthread_join.
我正在尝试学习如何在 C11 中使用,所以我尝试编译该示例:
#include <stdio.h>
#include <threads.h>
int run(void *arg)
{
printf("Hello world of C11 threads from thread %lu.\n", thrd_current());
fflush(stdout);
return 0;
}
int main()
{
thrd_t thread;
if (thrd_success != thrd_create(&thread, run, NULL))
{
perror("Error creating thread!");
return 1;
}
int result;
thrd_join(thread, &result);
printf("Thread %lu returned %d at the end\n", thread, result);
fflush(stdout);
}
问题是程序需要用额外的链接器标志编译:
$ gcc --std=c17 main.c
/usr/bin/ld: /tmp/ccEtxJ6l.o: in function `main':
main.c:(.text+0x66): undefined reference to `thrd_create'
/usr/bin/ld: main.c:(.text+0x90): undefined reference to `thrd_join'
collect2: error: ld returned 1 exit status
但是没有任何信息表明我应该使用什么标志,我注意到,使用 -lpthread
标志的编译是成功的:
$ gcc --std=c17 main.c -lpthread && ./a.out
Hello world of C11 threads from thread 140377624237824.
Thread 140377624237824 returned 0 at the end
但不代表就是正确的flag。 我正在使用 gcc:
$ gcc --version
gcc (Arch Linux 9.3.0-1) 9.3.0
请检查:
If the macro constant STDC_NO_THREADS(C11) is defined by the compiler, the header and all of the names listed here are not provided.
为什么要使用thread.h?它被认为是劣等 API。使用 pthread.h 而不是 POSIX 标准。 -lpthread 标志也用于在编译期间包含 pthread 库。 Pthread 手册页: http://man7.org/linux/man-pages/man0/pthread.h.0p.html
如果您决定在 Linux 平台上使用 < threads.h>,您必须 link 您的程序带有 -lpthread。
例如,如果您使用的是 GCC,您会发现 join 实现 here and you will also notice that it is just a call to pthread_join.