在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_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-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/