2017-09-10 22 views
0

QT Creator에서 실행 버튼을 사용하여 애플리케이션을 시작할 때 sftp를 사용하여 파일을 업로드해야하므로 정상적으로 작동합니다. 내가 찾은 무엇 Qt 크리에이터에서 실행 한 앱은 자체 실행시와 다른 라이브러리를 사용합니다.

는 자신의 응용 프로그램에서 실행할 경우 curl -V 내 OSX에 컬을 확인 CURLE_UNSUPPORTED_PROTOCOL

에게 있습니다 기본 컬이 SFTP를 나열하지 않음을 보여줍니다 오류 1을 반환한다는 것입니다.

그러나 어떻게 든 QT 작성자는 오류없이 파일을 업로드하기 때문에 sftp를 지원하는 컬을 사용하는 다른 상황에서 앱을 실행합니다.

QT Creator에서 실행했을 때와 같이 독립 실행 형 응용 프로그램이 동일한 버전의 dylib를 사용하는 이유는 무엇입니까?

답변

1

옵션 A) 변경 lib 디렉토리 경로

  • otool -L <full-path-of-app>를 수행 ps ax | grep <appname>
  • 를 사용하여 실행중인 응용 프로그램을 찾아이 당신에게 dylib 당신의 응용 프로그램을 제공합니다
  • 변경에 해결 사용하여 바이너리에서 dylibinstall_name_tool. Check this answer for more details은 QT 작성자가 사용하는 dylib을 가리 킵니다.

옵션 B) [유엔]/당신의 앱이 dylibRPATH을 할 수있는 잘못된 경로를 사용

또 다른 이유 RPATH을 설정합니다. otool -l <full-path-of-your-app>을 사용하여 귀하의 dylib에서 RPATH을 확인할 수 있습니다. RPATH는 위치 바이너리가 라이브러리를 처음 픽업 할 것임을 알려주며, 애플리케이션에 설정되어있는 경우 QT 작성자가 설정 한 RPATH을 해제 할 수 있습니다.

man page of dyld을 확인하여 RPATH의 작동 방식을 확인하십시오.

예를 들어 RPATH이 Xcode 앱에 설정되어 있는지 확인하십시오 (귀하는 dylib 섹션에서 LC_RPATH 필드를 찾고 있습니다). 해제 RPATH 사용하려면

$ otool -l /Applications/Xcode.app/Contents/MacOS/Xcode 
Load command 22 
      cmd LC_RPATH 
     cmdsize 48 
     path @executable_path/../Frameworks (offset 12) 
Load command 23 
      cmd LC_RPATH 
     cmdsize 56 
     path @executable_path/../SharedFrameworks (offset 12) 
Load command 24 
      cmd LC_RPATH 
     cmdsize 40 
     path @executable_path/../PlugIns (offset 12) 

install_name_tool -delete_rpath <RPATH-from-otool-l-output>

QT 제작자는 일반적으로이 일반적으로 존재하지 않는 그 패키지 및 대상 시스템에 제공 라이브러리를 사용합니다. 더 나은 할 일은 curl을 컴파일하고 응용 프로그램과 함께 제공합니다.

+0

실제로 Qt 작성자가 검사 한 응용 프로그램이 실행될 때 응용 프로그램 아이콘을 클릭하여 실행 중이었기 때문에 실제로 이러한 방식으로 작동하지 않는 이유를 알 수 없습니다. 그러나 otool과 install_name_tool을 가리키면 도움이되었습니다. 따라서 전달할 수있는 앱에 컬을 해킹 할 수있었습니다. 정적으로 건물을 만들면 컬과 그 의존성을 정적으로 만들어야하기 때문에 효과가 없습니다. – Mateusz

+0

@Mateusz 귀하의 사례로 의심되는 답변을 업데이트했습니다. – PnotNP