C语言 声明的结构与编译工具链中的结构同名,如何解决?



我已经实现了一组满足posix接口的函数,并希望在STM32开发板上运行它。然而,在编译过程中,发现声明的结构与交叉编译工具链中的结构名称重复。例如,它们都叫pthread_attr_t,编译时自动使用交叉编译工具链中的pthread_attr_t,导致程序出错。我应该如何解决这个问题,使我的程序正确地引用我自己声明的pthread_attr_t

我无法更改我的结构的名称,我也尝试将#include <face_pthread.h>更改为#include "face_pthread.h",但这并不能解决这个问题,所以我希望有人能帮助我。

我添加了一个案例来显示我的当前情况。

test.h

#ifndef __TEST__
#define __TEST__
typedef unsigned char INT8U;
typedef INT8U clockid_t;
void test();
#endif

test.c

#include "test.h"
void test() {
clockid_t time;
return;
}

我用arm-none-eabi-gcc

编译代码下面是错误信息

.../Test/test.h:5:15: error: conflicting types for 'clockid_t'
5 | typedef INT8U clockid_t;
| 
arm-none-eabiincludesystypes.h:199:21: note: previous declaration of 'clockid_t' was here
199 | typedef __clockid_t clockid_t;
|         

等一下,当我添加错误案例时,我发现我使用的操作系统在某个配置文件中引入了编译工具链的头文件#include <stdio.h>,在stdio.h中引入了相关文件#include <sys/types.h>,似乎是造成这个错误的,也许我需要更改问题:有没有办法避免这个冲突?

注意:几个可能重复的问题与重新实现标准库函数有关。这个问题是关于重新实现标准库类型的,我认为这是一个合法的基于事实的问题,我找不到一个重复的。

您正在尝试重新实现标准库的一部分,该部分包含在编译器包中。

你可以这样做,但是这可能比你想象的要多得多。

您可以从向gcc添加命令行参数-nostdinc开始。这将使它无法找到包含重复项的标头。它还会阻止它找到你可能想要的许多其他东西。你也必须重新实现它们。

如果你想在链接时避免重复的符号以及在编译时避免重复的类型定义,那么你可能需要-nostdlib。您可能还需要-ffreestanding。有关详细信息,请参阅gcc手册和评论中链接的问题。

最新更新