【发布时间】:2014-08-14 11:54:27
【问题描述】:
在构建busybox 时,我发现一些源文件包含Linux 内核头文件。
我添加了#define __KERNEL__ 来选择头文件行的某些部分。我还添加了#define _BUSYBOX_ 并在内核头文件中插入了#ifndef _BUSYBOX_ 以便编译器不会选择某些特定部分。(我不知道这是正确的方法)
我面临的下一个问题如下。它说 fd_set 定义了两次。
In file included from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/thread_info.h:10:0,
from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/preempt.h:9,
from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/spinlock.h:50,
from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/mmzone.h:7,
from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/gfp.h:4,
from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/slab.h:12,
from archival/libarchive/unxz/xz_private.h:16,
from archival/libarchive/unxz/xz_dec_bcj.c:11,
from archival/libarchive/decompress_unxz.c:36:
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/types.h:23:26: error: conflicting types for 'fd_set'
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/include/sys/select.h:75:5: note: previous declaration of 'fd_set' was here
消息显示 fd_set 首先在 sparc-snake-linux/include/sys/select.h 中定义,然后在 sparc-snake-linux/sys-include/linux/types.h 中再次定义。使用
回声"" | sparc-snake-linux-gcc -o /tmp/tmp.o -v -x c -
我可以看到默认的包含路径是
#include <...> search starts here:
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include-fixed
/opt/snakede/sparc-snake-linux/sys-include
/opt/snakede/sparc-snake-linux/include
它首先在 /opt/snakede/sparc-snake-linux/include 之前搜索 /opt/snakede/sparc-snake-linux/sys-include 但 /opt/snakede/sparc-snake-linux/include 下的文件是反正先选了。因此插入了许多#ifndef BUSYBOX 保护,以便第二个定义被编译阻止。被阻止的行主要在 sys-include 目录下。我想知道这是否是一种允许的方法(只是阻止第二个定义)或者对于这种情况是否有另一种更好、定义明确的方法(就像我应该阻止第一个定义——主要来自 gcc 包含头文件- 并使用 sys-include 目录下的文件,这些文件适用于目标系统) 编辑:使用 #ifndef BUSYBOX 我阻止了 20 多个第二次出现的定义,并且仍然看到此类错误出现。我不知道这是否是正确的方法。
【问题讨论】:
标签: linux gcc makefile include busybox