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

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

なぜこれが起こるのかについてのさまざまな可能性についての多くの議論を読んだが、すべてバイナリが配備されたシステムから欠落しているいくつかのライブラリについてです。これは私の場合ではありません。

最新のRaspbianがインストールされたRaspberry Pi 2とx86-64 Intelアーキテクチャを搭載したDebian 8ノートブックがあり、2番目のノートブックに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の内部で何が起こっているのかわかりません。走るリモートシステムのバイナリファイル。端末を介してRPiにSSHで接続し、バイナリを実行すると正常に動作します。したがって、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
    

2回目は正しいです。しかし、最初のことを何を考えるべきかわかりません。

また、2つを比較するために、Raspbianでg ++ -arm-linux-gnueabihfを使用して新しいバイナリをコンパイルしました。これlddの出力1つの小さな例外を除いて、ライブラリがロードされるメモリアドレス(括弧内の16進数)が異なります。

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

  • 鍵認証に変更
  • 私のRPiでシェルをチェックしました - bashです
  • RequestTTY=force新しく作成されたアイテムに追加~/.ssh/config

まったく変わったことはありません。同じ昔の物語。ただし、実際の終了コードは次のとおりです。2。 ~からTLDP:

2: シェル組み込みの乱用 (Bash 文書による) 例: empty_function() {} 説明: キーワードまたはコマンドの欠落または権限の問題 (および失敗したバイナリ比較の diff 戻りコード)。

これは私のバイナリには適していません。また、権限も確認しました。drwxr-xr-x。これは誰でも実行して読むことができることを意味します。

答え1

QCreatorがRPi2で無効なシェルタイプを使用しているようです。エラーメッセージは、シェルが配列タイプを作成できなかったことを示します。これは、bashではなくdash sayを実行していることを示します。

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

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

関連情報