2017-09-10 4 views
0

Je dois utiliser sftp pour télécharger des fichiers lorsque l'application est lancée avec le bouton Exécuter de QT Creator, il fonctionne très bien.App run de Qt Creator utilise la bibliothèque différente que lorsque sa course sur son propre

Ce que je trouve est que lorsqu'il est exécuté sur sa propre application renvoie l'erreur 1 qui est CURLE_UNSUPPORTED_PROTOCOL

Vérification boucle sur mon osx avec curl -V montre que boucle par défaut ne liste pas SFTP.

créateur Cependant en quelque sorte l'intervalle QT court application dans un contexte différent qui utilise boucle qui a le soutien pour SFTP, car il télécharge des fichiers sans erreur.

Alors question est de savoir comment puis-je faire application de façon autonome utilise la même version de dylib que lorsqu'il est lancé depuis QT Creator?

Répondre

1

OPTION A) changer de chemin lib

  • Trouver l'application en cours d'exécution en utilisant ps ax | grep <appname>
  • Do otool -L <full-path-of-app>, cela vous donnera dylib votre application décide de
  • Modifier le dylib dans votre binaire en utilisant install_name_tool. Check this answer for more details pour pointer vers dylib utilisé par le créateur QT.

OPTION B) [un]/mis RPATH

Une autre raison pour laquelle votre application utilise chemin incorrect pourrait être RPATH sur votre dylib. Vous pouvez vérifier RPATH sur votre dylib en utilisant otool -l <full-path-of-your-app>. RPATH vous indique que l'emplacement binaire va d'abord prendre les bibliothèques à partir de, s'il est défini dans votre application, vous pouvez désactiver RPATH défini par le créateur QT.

Vérifiez man page of dyld pour savoir comment fonctionne RPATH.

Par exemple, cochez RPATH dans l'application Xcode (vous recherchez le champ LC_RPATH dans la section dylib).

$ 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) 

Pour unset RPATH utilisation install_name_tool -delete_rpath <RPATH-from-otool-l-output>

créateur QT utilise généralement des bibliothèques livrées avec son emballage et sur votre système cible ceux-ci ne sont généralement pas présents. Mieux vaut faire curl de compilation et d'expédier avec votre application

+0

En fait toujours ne sais pas pourquoi il se comportait de cette façon, parce que lorsque l'application inspecté par Qt créateur était exactement le même que je courais en cliquant sur l'icône de l'application. Mais en pointant sur otool et install_name_tool, j'ai eu assez d'aide pour pouvoir pirater l'application que je pouvais livrer. Construire statiquement n'a pas fonctionné parce que je devrais construire curl et ses dépendances statiquement. – Mateusz

+0

@ Mateusz J'ai mis à jour la réponse de ce que je soupçonne être votre cas. – PnotNP