我正在尝试使用 Android NDK 编译 OpenSSH,但失败了。
我的尝试包括以下步骤:
交叉编译 OpenSSL for Android 并将头文件/库安装到
/home/me/arm
从这里获取 OpenSSH 6.2p1
提取存档并运行
./configure
:./configure --prefix=/home/me/arm \ --host=arm-linux-androideabi \ --with-ssl-dir=/home/me/arm
...导致以下错误:
getrrsetbyname.c:166:2:错误:未知类型名称'HEADER'
修改
./configure
命令以包括:ac_cv_search_getrrsetbyname=是
...解决了一个问题,但仍然因另一个错误而中止:
/usr/include/linux/un.h:17:8: 错误: 'struct sockaddr_un' 的重新定义
再次修改
./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” [默认启用]