【问题标题】:Can't run C++ app from linux console - "not found" error无法从 linux 控制台运行 C++ 应用程序 - “未找到”错误
【发布时间】:2024-01-21 15:48:01
【问题描述】:

我有 2 个运行 openwrt linux 的 MIPS 路由器。其中一个很好,我可以轻松地从控制台运行我的应用程序。 我通过 scp(这是我的应用程序,一个文件)将它复制到另一个路由器,当我尝试运行它时,出现“未找到”错误:

root@OpenWrt:~# pwd
/root
root@OpenWrt:~# ls -l
-rwxr-x---    1 root     root        132001 Apr  2 17:37 app
root@OpenWrt:~# ./app
ash: ./app: not found
root@OpenWrt:~# uname -a
Linux OpenWrt 3.7.9 #3 Mon Aug 5 16:25:53 EEST 2013 mips GNU/Linux

我不是linux新手,但是找不到这里的问题。

【问题讨论】:

  • 我不确定,但有些事情告诉我这与缺少依赖项有关。也许链接器找不到路由器 1 上存在但路由器 2 上没有的给定依赖项。尝试在目标平台上重新编译二进制文件。
  • 你可以运行“file ./app”来检查它是否真的是一个可执行文件
  • @jDo 也许缺少依赖项。这肯定是可能的。但我没想到这里不会出现“未找到”错误。我在目标平台上没有 ldd,所以我不知道如何检查缺少哪些依赖项。你有什么建议吗?
  • @rightaway717 刚刚发现this 似乎重新产生/演示了错误
  • @jDo ok,好像是这样。谢谢。请发布一个答案,这样我可以在确认后接受它

标签: linux unix console console-application


【解决方案1】:

我当然不是编译器专家,但是从在嵌入式系统上移动二进制文件时的痛苦经历来看,这个神秘的错误让我相信这是某种依赖错误;可能缺少链接器。在目标系统上重新编译二进制文件在过去为我解决了这个问题。

正如 Kevin Vasko 在 cmets 中问的那样:“你能在上面运行 ldd ./app 吗?”

这是确定程序需要哪些库和链接器的好方法。也可以按照this answer 中的建议执行类似的问题,并运行以下命令以仅获取“程序解释器”行(ldd 将显示几个依赖项):

readelf -l app | grep "program interpreter"

在我的系统上,这显示了 GNU 链接器 ld,但有一行解释性的文本可能会有所帮助 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

因此,我怀疑如果我从系统中删除了这个“程序解释器”,我会得到同样的错误(可能还有很多其他错误)。再次尝试在目标系统上重新编译二进制文件,或者通过将正确的文件移动到正确的位置来手动满足任何缺失的依赖项。

【讨论】:

  • 感谢您的帮助。我在目标系统上没有 ldd 或 readelf ,但我在工作路由器上有它们,所以我检查了那里的依赖关系,将缺少的依赖项复制到目标路由器并且它工作了。
【解决方案2】:

在您的 ./app 内部,我感觉您正在调用的东西不存在。在这种情况下,“ash”命令。

基于这个错误

ash: ./app: not found

我觉得您正在 ./app 中运行一段代码。基于“ash”,我会说您正在尝试运行“bash”。如果我不得不猜测你在脚本中输入了错误的标题

#!/bin/bash

【讨论】:

  • 不,抱歉,这实际上是一个 c++ 应用程序。这里没有外壳
  • @rightaway717 啊,你用“灰”壳做什么?
  • 不,除了我尝试在其中运行应用程序之外什么都没有。我也尝试从普通的sh 运行它
最近更新 更多