web-dev-qa-db-ja.com

構文エラー:リモートで実行すると予期しない単語(「)」が必要ですが、ローカルでの実行に問題はありません

なぜそのようなことが起こり得るのか、さまざまな可能性について多くの議論を読みましたが、すべてはバイナリがデプロイされているシステム上のいくつかの欠落しているライブラリに関するものです。これは私の場合ではありません。

最新のRaspbianを搭載したRaspberryPi 2と、x86-64Intelアーキテクチャを搭載したDebian8ノートブックとQtCreator 3.2.1が2番目にインストールされており、を使用してバイナリをクロスコンパイルしています。 arm-linux-gnueabihf-g ++Emdebian リポジトリを使用)。 公式RPi githubリポジトリ で提供されている最適化コンパイラを使用していません。

これが 私の問題の前提条件 です。たくさんの汗と罵倒の後、私は自分のバイナリをノートブックからRPi2にクロスコンパイルして展開することができました。そしてここに問題があります:

  • Qt Creator(SSH経由でRPi2に接続し、SFTP経由でファイルを転送し、唯一のRPiユーザーとしてログインしている(したがって、「アクセスの問題」はここでは確実に除外されます))からバイナリを実行しようとすると私のノートブック私は得る:

    構文エラー:予期しない単語( ")"を期待)

  • バイナリをRPiで直接実行しようとすると、問題なく実行されます。

私がstackoverflowに投稿したように、私のコードには、実行時にバイナリが存在するディレクトリにテキストファイルを書き込む純粋なC++のみが含まれています。そこには何も奇妙なことは起こっていません。

それで、ここでの主な質問は、これがQt Creator関連の問題なのか、それとももっと深くなるものなのかということです。 Qt Creatorがリモートシステムでバイナリを内部的に実行する方法が正確にわかりません。 SSH経由でターミナル経由でRPiに接続し、バイナリを実行すると、正常に動作します。したがって、QtCreatorが実行する方法と関係があります。ノートブックでARMバイナリを実行すると、すべての期待どおりの結果が返されることに注意してください(RPiCrossCompileRemoteTestは私のバイナリの名前です)。

bash: ./RPiCrossCompileRemoteTest: cannot execute binary file: Exec format error

したがって、Qt CreatorはバイナリをRPiで直接開始することも、ノートブックで開始しようとすることもありません(そうしないと、上からフォーマットエラーが発生します)。

これを解決するためにどのように進めることができるかについてのアイデアはありますか?私はこの問題と数日間、すべて無駄に戦ってきました。 :-/

EDIT:@ steveが提案したように、両方の実行可能ファイルでlddを実行します。

  • RPiの場合:

    /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
    

2番目は正しいです。しかし、最初のものについて考えることはわかりません。

また、Raspbianにあるg ++-arm-linux-gnueabihfを使用して、両方を比較するために新しいバイナリをコンパイルしました。 ldd出力は文字通り同じですが、メモリアドレス(括弧内のHEX番号)が異なるという小さな例外があります。 libsがロードされます。

編集2:@ gogoudが提案したように:

  • キー認証に変更されました
  • 私のRPiでシェルをチェックしました-それはbashです
  • 新しく作成された〜/ .ssh/configRequestTTY=forceを追加しました

まったく変化はありません。同じ古い話。ただし、実際の終了コード2に気づきました。から [〜#〜] tldp [〜#〜]

2:シェルビルトインの誤用(Bashドキュメントによる)例:empty_function(){}コメント:キーワードまたはコマンドの欠落、またはアクセス許可の問題(および失敗したバイナリファイルの比較での差分リターンコード)。

これは私のバイナリには意味がありません(私は思います)。権限も確認しました:drwxr-xr-x。これは、すべての人がそれを実行して読み取ることができることを意味します。

2
rbaleksandar

QCreatorがRPi2で間違ったシェルタイプを使用しているように聞こえますか?エラーメッセージは、シェルが配列型を作成できないことを示しています。これは、bashではなくダッシュセイを実行していることを示している可能性があります。

この場合、特定のシェル(おそらくbash)を使用するためにRPi2でsshログインを「強制」する方法を見つける必要があります。制限された方法の1つは、パスワードベースではなくキーベースのsshログインで強制コマンドを使用することです。ただし、これにより、このユーザーはログイン時に単一のコマンドセットを実行するように制限されます。

関連するユーザーのRPi2でchshを使用して、デフォルトのシェルを/ bin/bashに設定してみてください。すでにこれに設定されている場合は、ローカルマシン(QtCreatorを実行している)のクライアントユーザーの〜/ .ssh/configにRequestTTY = forceを追加してみてください。

1
gogoud