首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将特定于主机的*.c/*.h添加到autotool项目

将特定于主机的*.c/*.h添加到autotool项目
EN

Stack Overflow用户
提问于 2015-01-29 11:19:49
回答 1查看 88关注 0票数 0

我正在尝试使用Android NDK交叉编译库。我收到一个错误,因为NDK的linux/quota.h没有实现quotactl() (manpage),正如库所期望的那样。

Android内核将quotactl()实现为系统调用,所以我的计划是创建一个存根函数,使用__NR_quotactl简单地将quotactl()转发到syscall()

代码语言:javascript
复制
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.h中的include-guards )

我正在交叉编译的库使用autoconf、libtools和automake。因为这是特定于主机的更改,所以我希望它对automake文件是透明的,这意味着将其添加到configure.ac文件中。

我可以在已经在configure.ac中的切换块中添加android特定的autoconf代码。

代码语言:javascript
复制
case $host_os in

   *mingw32*)
     ...
     ;;

  *darwin*)
    ...
    ;;

   *android*)
    have_android="yes"
    # something...
    ;;

esac

有没有一种惯用的,干净的,自动工具的方式来将我的quota.c添加到每个构建目标,并仅当构建是为android主机构建时才包含我的quota.h文件?我的目标是让这个黑客尽可能独立于项目的其余部分。

我计划在根项目目录中添加一个compat/android/sys目录,并将它们放在那里。然后,我可以通过gcc的-I标志将其包括在内,并将quota.c添加到需要quotactl()的组件的源代码列表中。

EN

回答 1

Stack Overflow用户

发布于 2015-01-29 18:22:25

首先,定义ANDROID宏是多余的。如果你使用的是Android NDK,那么gcc和clang都已经定义了__ANDROID__宏。

其次,实现所需内容的最简单方法是将quota.c添加到常见的源代码列表中,但使用ifdef包装其内容:

代码语言:javascript
复制
#ifdef __ANDROID__

#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);
}

#endif /* __ANDROID__ */

更新:如果你仍然想使用有条件的源集,而不是用ifdefs包装内容,这很容易做到。只需遵循the doc并将linux替换为android即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28206452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档