对齐结构在全球范围内不可用

mar*_*094 5 c struct pointers alignment draw

我有一个用于Raspberry Pi的小裸机程序,可以绘制到屏幕上.我使用C,GCC作为编译器,Yagarto作为ARM工具链.

目前,我有一个标头(gpu.h),它声明了GPU读取的帧缓冲结构(它包含分辨率和位深度).GPU填充结构中的值,包括绘制到的指针:

struct frame_buffer {
    int width;
    int height;
    int vwidth;
    int vheight;
    int bytes;
    int depth;
    int ignorex;
    int ignorey;
    int pointer;
    int size;
};
extern struct frame_buffer framebuf;
Run Code Online (Sandbox Code Playgroud)

该结构在main.c中定义(不在函数内):

struct frame_buffer framebuf __attribute__ ((aligned (16))) = {GPU_HRES, GPU_VRES, GPU_HRES, GPU_VRES, 0, GPU_BITDEPTH, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)

另外在main.c中是一个向屏幕绘制字符的函数(draw_char),以及我自己的putchar()实现,它使用draw_char函数.目前这个工作正常.

如果我将draw_char函数移动到另一个文件,一切都编译正常,但没有任何内容被绘制到屏幕上.

我认为结构不可用于全局,因此指针不正确.

我应该怎么做才能解决这个问题?

谢谢

Dir*_*ker 0

您没有提供足够的信息来实际解决您的问题,但上述评论很可能是正确的 - 要么数据结构不同,要么功能不同。我只能给出一些如何查找原因的建议,这在过去帮助我解决了类似问题:

1)使用objdump(gcc工具链)或类似工具并检查目标文件所需的内容以及导出的内容。每个函数和结构应该只存在于一个目标文件中(并且应该从其他文件中导入)。

2) 验证是否存在同名的库函数并在链接阶段使用(putchar()这里的名称非常危险)。C 链接器不验证参数(与 C++ 链接器不同)。确保链接器首先获取您的对象,然后获取库。对于大多数编译器/链接器来说,参数的顺序是相关的。

3)在文件和头文件中单独重命名变量,并检查代码是否仍然可以编译。未修改的文件不应编译。

4)添加调试语句,为您提供函数和变量的地址。运行软件时,变量的地址应该始终相同(我假设您找到了除了显示函数之外输出调试文本的另一种可能性)。

5)你说指针已被获取 - 验证它在整个代码中确实是相同的,并确保值不会被覆盖。

抱歉,没有更多想法了。