在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 ...


而且您只是复制/粘贴错误。否则,您不会显示所有得到的错误。



除此之外。
问题很可能是由于您的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-none-eabi-g++不支持线程。您可以通过调用arm-none-eabi-g++ -xc -E -v -来确认编译器的编译方式。它将输出类似

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

您确定要瞄准右臂架构吗?有几种针对不同手臂架构的交叉编译器。

关于c++ - arm-none-eabi-g++编译器抛出编译错误pthread_exit未在此范围内声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29003293/

10-16 10:24