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_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 架构的交叉编译器。
运行 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_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 架构的交叉编译器。