arm-none-eabi-g++ 编译器抛出编译错误 pthread_exit 未在此范围内声明

Posted

技术标签:

【中文标题】arm-none-eabi-g++ 编译器抛出编译错误 pthread_exit 未在此范围内声明【英文标题】:arm-none-eabi-g++ compiler throws compilation error pthread_exit was not declared in this scope 【发布时间】:2015-03-12 06:36:01 【问题描述】:

在 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);

【问题讨论】:

你自己创建了一个pthread.h文件? 如果他这样做了,那么g++也会优先匹配-I.中的头文件。我想问题可能出在 arm 交叉编译器附带的 pthread.h 上。 我没有创建 pthread.h。 arm-none-eabi-g++ 参考 pthread.h 文件 #1 "/usr/include/newlib/pthread.h" 1 3 # 25 "/usr/include/newlib/pthread.h" 3 # 29 "/usr /include/newlib/pthread.h" 2 3 # 427 "/usr/include/newlib/pthread.h" 3 是否需要重新安装arm交叉编译器? @Raj:看我的回答。重新安装 arm 交叉编译器没有帮助。 【参考方案1】:

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

#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 交叉编译器不支持线程。

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

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

您确定您的目标是正确的手臂架构吗?有多种交叉编译器适用于不同的 arm 架构。

【讨论】:

我在粘贴时错过了 # 符号。那不是问题。我尝试使用 -E 编译,g++ 参考 /usr/include/pthread.h 但 arm 交叉编译器参考 /usr/inlcude/newlib/pthread.h。那是不同的。我需要重新安装什么吗? 不,问题是arm 编译器使用了pthread.h 的嵌入式版本,需要与常规版本不同。 这是我得到的 root@ie3becccilxagt01:/home/rhel/c# apt-cache show libnewlib-arm-none-eabi 包:libnewlib-arm-none-eabi 来源:newlib 版本:2.1。 0+git20140818.1a8323b-2 安装大小:118434 维护者:Agustin Henze 架构:全部 依赖:libnewlib-dev 推荐:gcc-arm-none-eabi,libstdc++-arm-none-eabi-newlib建议:libnewlib-doc Newlib 是一个用于嵌入式系统的 C 库和数学库。 也许您应该更仔细地阅读我的回答?无论如何,gcc-arm-none-eabi 的目标是“使用 Cortex-M0/M0+/M3/M4、Cortex-R4/R5/R7 和 Cortex-A* 处理器的 ARM 芯片。”,并且不支持线程。不知道是不是因为这些架构不支持,还是只是编译器的问题。你必须自己弄清楚。如果您想要的是针对 不同的 arm 架构,则使用相应的交叉编译器。例如gcc-arm-linux-gnueabi. 感谢您的帮助。我理解编译器的问题。我会尝试其他编译器。

以上是关于arm-none-eabi-g++ 编译器抛出编译错误 pthread_exit 未在此范围内声明的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-链接实例分析

编译原理-链接实例分析

如何向编译器表明函数总是抛出? [复制]

arm-none-eabi-g++:在 Eclipse 中找不到命令

为啥编译器会抛出“预期类型说明符”?

.Net 2+:为啥 if( 1 == null ) 不再抛出编译器异常?