我读过很多关于为什么会发生这种事情的各种可能性的讨论,但是所有讨论都是关于部署二进制文件的系统上缺少一些库的。这不是我的情况。
我有一个带有最新 Raspbian 的 Raspberry Pi 2 和一个带有 x86-64 Intel 架构的 Debian 8 笔记本,第二个上安装了 Qt Creator 3.2.1,我使用ARM-Linux-gnueabihf-g++(使用恩德比安存储库)。我没有使用中提供的优化编译器官方 RPi github 存储库。
这是我的问题的前提。经过大量的汗水和咒骂,我成功地交叉编译我的二进制文件并将其从笔记本部署到 RPi2 上。问题是这样的:
当我尝试使用 Qt Creator 运行我的二进制文件(通过 SSH 连接到 RPi2,通过 SFTP 传输文件并以我唯一的 RPi 用户身份登录(因此这里肯定排除“访问问题”))我的笔记本我得到:
语法错误:单词意外(需要“)”)
当我尝试运行我的二进制文件时直接在我的 RPi 上它运行没有任何问题。
正如我在 stackoverflow 上发布的那样,我的代码仅包含纯 C++,将文本文件写入二进制文件执行时所在的目录。那里没有什么奇怪的事情发生。
所以这里的主要问题是这是一个 Qt Creator 相关问题还是更深入的问题?我不知道 Qt Creator 内部究竟如何运行远程系统上的二进制文件。如果我通过终端通过 SSH 连接到我的 RPi 并执行二进制文件,它就可以正常工作。所以它必须以 Qt Creator 执行它的方式来做一些事情。请注意,在我的笔记本上执行 ARM 二进制文件会返回我们所期望的结果(RPiCrossCompileRemoteTest 是我的二进制文件的名称):
bash: ./RPiCrossCompileRemoteTest: cannot execute binary file: Exec format error
因此,Qt Creator 既不会直接在 RPi 上启动二进制文件,也不会尝试在我的笔记本上启动它(否则它会给我上面的格式错误)。
我有什么想法可以解决这个问题吗?我已经与这个问题斗争了几天,但毫无结果。 :-/
编辑:ldd
正如@steve在两个可执行文件上运行的建议:
在树莓派上:
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x76f84000) libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76ea3000) libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76e32000) libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76e0a000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76cda000) /lib/ld-linux-armhf.so.3 (0x76f91000)
在笔记本上:
not a dynamic executable
第二个是正确的。但我不知道要考虑第一个。
我还使用 Raspbian 中的 g++-arm-linux-gnueabihf 编译一个新的二进制文件以便比较两者。这的输出ldd
实际上是相同的有一个小例外,我有不同的内存地址(括号中的十六进制数字)将加载库。
编辑2: 正如@gogoud 建议的:
- 改为密钥认证
- 检查了我的 RPi 上的 shell - 它是 bash
- 添加
RequestTTY=force
到新创建的〜/ .ssh /配置
一点变化都没有。同样的老故事。然而我确实注意到了实际的退出代码:2。从TLDP:
2:滥用 shell 内置函数(根据 Bash 文档) 示例:empty_function() {} 注释:缺少关键字或命令,或权限问题(以及失败的二进制文件比较时的 diff 返回代码)。
这对我的二进制文件没有意义(我认为)。我还检查了它的权限:drwxr-xr-x
。这意味着所有人都可以执行和读取它。
答案1
我觉得 QCreator 在您的 RPi2 上使用了错误的 shell 类型?该错误消息表明 shell 无法创建数组类型,这可能表明它正在运行 dash say 而不是 bash。
如果是这种情况,您需要找到一种方法来“强制”RPi2 上的 ssh 登录使用给定的 shell(可能是 bash)。一种有限的方法是使用强制命令和基于密钥(而不是基于密码)的 ssh 登录。然而,这会限制该用户在登录时只能运行一组命令。
您可以尝试在 RPi2 上使用 chsh 让相关用户将默认 shell 设置为 /bin/bash?如果已经设置为此,那么您可以尝试将 RequestTTY=force 添加到本地计算机(运行 QtCreator 的计算机)上的客户端用户的 ~/.ssh/config 中。