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_exit
和pthread_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 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 未在此范围内声明的主要内容,如果未能解决你的问题,请参考以下文章