arm-none-eabi-g++ 编译器抛出编译错误 pthread_exit was not declared in this scope

arm-none-eabi-g++ compiler throws compilation error pthread_exit was not declared in this scope

运行 in debian linux arm-none-eabi-g++ pthread.c -o pthread -lpthread 抛出以下编译错误。但是如果我运行 g++ pthread.c -o pthread -lpthread 就没有编译错误。我从未使用过交叉编译器。我知道库中的链接存在问题。请帮我。我在互联网上搜索了很多,但没有运气。

我的pthread.c程序:

include "pthread.h" 
include "stdio.h"
include "stdlib.h"

void *worker_thread(void *arg) 
{ 
    printf("This is worker_thread()\n"); 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t my_thread; 
    int ret; 
    printf("In main: creating thread\n"); 
    ret = pthread_create(&my_thread, NULL, &worker_thread, NULL); 
    if(ret != 0) 
    {
        printf("Error: pthread_create() failed\n"); 
        exit(EXIT_FAILURE); 
    } 
    pthread_exit(NULL); 
}

编译错误:

pthread.c: In function 'void* worker_thread(void*)':

pthread.c:8:18: error: 'pthread_exit' was not declared in this scope
pthread_exit(NULL);
                  ^
pthread.c: In function 'int main()':
pthread.c:15:1: error: 'pthread_t' was not declared in this scope
 pthread_t my_thread;
 ^
pthread.c:15:11: error: expected ';' before 'my_thread'
 pthread_t my_thread;
           ^
pthread.c:18:23: error: 'my_thread' was not declared in this scope
 ret = pthread_create(&my_thread, NULL, &worker_thread, NULL);
                       ^
pthread.c:18:60: error: 'pthread_create' was not declared in this scope
 ret = pthread_create(&my_thread, NULL, &worker_thread, NULL);
                                                            ^
pthread.c:24:21: error: 'pthread_exit' was not declared in this scope
  } pthread_exit(NULL);

我假设您代码中的前三行是:

#include ...

而不是

include ...

而你 copy/pasted 错了。否则你不会显示你得到的所有错误。


除此之外。 问题很可能是由于您的 pthread.h 文件发生了一些奇怪的事情。使用 -E 选项编译您的程序(从预编译器输出结果):

 arm-none-eabi-g++ -E pthread.c -o foobar -lpthread

然后查看输出文件 foobar,搜索 pthread.h,或者只是:

 grep 'pthread.h' foobar

这为您提供了交叉编译时包含的 pthread.h 文件的完整路径。将此与常规 g++ 编译器包含的头文件进行比较。这可能会给您提供有关正在发生的事情的线索。 (例如,如果它指向您可能创建的本地 pthread.h。)


例如,在我的系统上,g++ 找到以下 pthread.h:

/usr/include/pthread.h

arm-none-eabi-g++ 使用:

/usr/include/newlib/pthread.h

这个 newlib/pthread.h 没有声明任何 pthread_exitpthread_t,这是你的问题。


那么,这个 newlib/pthread.h 是从哪里来的呢?使用 apt-file search newlib/pthread.h,它表明这是包 libnewlib-dev 的一部分,apt-cache show libnewlib-dev 表示这是:...library intended for use on embedded systems,这显然是 arm 交叉编译器使用。


所以,长话短说:你的 arm 交叉编译器不支持线程。

所以,长话短说: arm-none-eabi-g++ 不支持线程。您可以通过调用 arm-none-eabi-g++ -xc -E -v - 来确认编译器是如何编译的。它会输出类似

的东西

Configured with: ...blablabla... --disable-threads

您确定您的目标是正确的手臂架构吗?有几种针对不同 arm 架构的交叉编译器。