구문 오류: 원격으로 실행할 때 예기치 않은 단어(")" 필요)가 있지만 로컬로 실행할 때는 문제가 없습니다.

구문 오류: 원격으로 실행할 때 예기치 않은 단어(")" 필요)가 있지만 로컬로 실행할 때는 문제가 없습니다.

왜 이런 일이 발생하는지에 대한 다양한 가능성에 대한 많은 토론을 읽었지만 모두 바이너리가 배포된 시스템에서 누락된 일부 라이브러리에 관한 것입니다. 이것은 내 경우가 아닙니다.

최신 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 내부에서 무슨 일이 일어나고 있는지 모르겠습니다.달리다원격 시스템의 바이너리 파일. 터미널을 통해 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
    

두 번째가 맞습니다. 하지만 첫 번째 것을 무엇을 고려해야할지 모르겠습니다.

또한 두 가지를 비교하기 위해 Raspbian에서 g++-arm-linux-gnueabihf를 사용하여 새 바이너리를 컴파일했습니다. 이것ldd의 출력한 가지 작은 예외를 제외하면 라이브러리가 로드될 메모리 주소(괄호 안의 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를 추가해 볼 수 있습니다.

관련 정보