4

我正在尝试使用 Android NDK 编译 OpenSSH,但失败了。

我的尝试包括以下步骤:

  1. 交叉编译 OpenSSL for Android 并将头文件/库安装到/home/me/arm

  2. 从这里获取 OpenSSH 6.2p1

  3. 提取存档并运行./configure

    ./configure --prefix=/home/me/arm \
            --host=arm-linux-androideabi \
            --with-ssl-dir=/home/me/arm

    ...导致以下错误:

    getrrsetbyname.c:166:2:错误:未知类型名称'HEADER'
  4. 修改./configure命令以包括:

    ac_cv_search_getrrsetbyname=是

    ...解决了一个问题,但仍然因另一个错误而中止:

    /usr/include/linux/un.h:17:8: 错误: 'struct sockaddr_un' 的重新定义
  5. 再次修改./configure命令以包括:

    ac_cv_header_sys_un_h=是

    ...这让我更进一步,但仍然因错误而中止:

    channels.c:在函数“channel_prepare_select”中:
    channels.c:2143:2:警告:函数“多少”的隐式声明
    [-Wimplicit-function-declaration]
    channels.c:2145:45: error: 'fd_mask' undeclared (首先在这个函数中使用)

现在我被困住了。我已经破解了打开的 Androidsys/select.h并发现它fd_mask在任何地方都没有定义。我也找不到./configure解决此问题的选项。还有howmany()未定义的问题。

我需要进行哪些更改才能使程序编译?


编辑:我现在已经设法走得更远了。我添加了以下行./configure来克服“未定义fd_mask”错误:

--with-cflags=-Dfd_mask=int

然后我收到以下错误:

错误:“struct passwd”没有名为“pw_gecos”的成员

Android 的passwd结构没有pw_gecos成员。如果不为源代码创建一个实际的补丁,这是不可能纠正的。补丁在这里

我现在遇到以下错误:

dns.c:在函数“dns_result_totext”中:
dns.c:56:7: error: 'ERRSET_SUCCESS' undeclared (第一次在这个函数中使用)
dns.c:56:7:注意:每个未声明的标识符仅报告一次
  它出现的功能
dns.c:58:7: error: 'ERRSET_NOMEMORY' undeclared (第一次在这个函数中使用)
...

编辑:我对上面的补丁做了一些修改,到目前为止消除了很多错误。我也加了ldns。配置命令现在看起来像这样:

补丁 -p0 <openssh.patch;
自动配置;
./configure --prefix=/home/me/arm \
            --host=arm-linux-androideabi \
            --with-ldns=/home/me/arm\
            --with-ssl-dir=/home/me/arm \
            ac_cv_header_sys_un_h=是

...是新补丁。我现在得到的错误是:

loginrec.c:在函数“construct_utmp”中:
loginrec.c:665:17: error: 'DEAD_PROCESS' undeclared (first use in this function)
loginrec.c:665:17:注意:每个未声明的标识符仅报告一次
  它出现的每个函数
loginrec.c:在顶层:
loginrec.c:727:45:警告:在参数列表中声明了“struct utmpx”
  [默认启用]
4

0 回答 0