将特定于主机的*.c/*.h添加到autotool';教育项目
我正在尝试使用Android NDK交叉编译一个库。我收到一个错误,因为NDK的将特定于主机的*.c/*.h添加到autotool';教育项目,c,linux,android-ndk,autotools,C,Linux,Android Ndk,Autotools,我正在尝试使用Android NDK交叉编译一个库。我收到一个错误,因为NDK的linux/quota.h没有实现库所期望的quotactl()() Android内核将quotactl()实现为一个系统调用,因此我的计划是创建一个存根函数,使用NR quotactl将quotactl()转发到syscall(): quota.h: #include <linux/quota.h> int quotactl(int cmd, const char *special, int id,
linux/quota.h
没有实现库所期望的quotactl()
()
Android内核将quotactl()
实现为一个系统调用,因此我的计划是创建一个存根函数,使用NR quotactl
将quotactl()
转发到syscall()
:
quota.h:
#include <linux/quota.h>
int quotactl(int cmd, const char *special, int id, caddr_t addr);
quota.c:
#include "quota.h"
#include <sys/syscall.h>
int quotactl(int cmd, const char *special, int id, caddr_t addr) {
syscall(__NR_quotactl, cmd, special, id, addr);
}
是否有一种惯用的、干净的、自动工具式的方法将我的quota.c
添加到每个构建目标中,并且仅当构建用于android主机时才包含我的quota.h
文件?我的目标是让这个黑客尽可能独立于项目的其他部分
我计划在根项目目录中添加一个
compat/android/sys
目录,并将它们放在那里。然后,我可以通过gcc的-I
标志将其包括在内,并将quota.c
添加到需要quotactl()
的组件的源列表中 首先,定义ANDROID
宏是多余的。如果您使用的是Android NDK,那么gcc和clang都已经定义了\uuuuu Android\uuuu
宏
其次,实现所需功能的最简单方法是将quota.c添加到通用源代码列表中,但使用ifdef包装其内容:
\ifdef\uu ANDROID__
#包括“配额.h”
#包括
int quotactl(int cmd,常量字符*特殊,int id,caddr_t addr){
系统调用(编号、命令、特殊、id、地址);
}
#endif/*.\uu安卓系统*/
UPD:如果您仍然希望使用条件源集而不是使用ifdef包装内容,那么这很容易做到。只需按照
linux
替换为android
对不起,如果我误解了,但是您能澄清一下:如果android(linux)内核实现了quotactl
,您需要特殊的代码来利用它。如果它是另一个操作系统,您只需要为quotactl
?某种类型的文件创建存根。Android内核(至少有3个现有版本)肯定实现了quotactl()
,但NDK没有提供声明。其他操作系统也可以,因为它们使用的标准头声明函数和实现它的东西(可能是libc)。我的计划是,当构建用于android主机时,在我自己的实现中编译,在内核中使用syscall()
+1 for\uuuu android
调用quotactl()
。似乎有条件地编译整个源文件比使用#ifdef
更干净,我已经更新了这个问题。此外,没有一个通用的源列表,是否有一种idomatic方法可以使用autotools将其添加到所有目标?如果您仍然希望使用条件源集而不是使用ifdef包装内容,这很容易做到。只需遵循doc:并将linux
替换为android
。太好了,谢谢!如果你想在你的回答中加上这个,我会接受的
case $host_os in
*mingw32*)
...
;;
*darwin*)
...
;;
*android*)
have_android="yes"
# something...
;;
esac