2010-10-04 22 views
6

Résumé

Je souhaite exécuter mon application croisée sur les bibliothèques 10.5. Y a-t-il une variable environnementale qui permet à cela de fonctionner?Exécution d'applications sur un SDK différent sous OS X?

version plus longue

I application multiplate-compilé mon OS X C++ pour une cible de 10,5, sur un hôte 10.6. Il compile bien. L'application compilée est liée à des bibliothèques telles que /usr/lib/libstdc++.6.dylib. Quand je l'exécute sur mon système, il utilisera la version 'host' des bibliothèques, qui sont 10.6. Je voudrais le tester par rapport aux versions 10.5, qui sont toutes contenues dans le répertoire `/Developer/SDKs/MacOSX10.5.sdk. Comment puis-je faire cela?

J'ai essayé différentes variantes de DYLD_LIBRARY_PATH, DYLD_ROOT_PATH, etc, comme documented in the manual, mais je n'ai pas réussi à le faire fonctionner.

+1

Très bonne question, je n'ai pas de réponse, aimerais entendre un. – jv42

+0

Ne pas connaître la réponse non plus, mais C++ peut être facilement compilé en tant que binaire * statique * - il inclura toutes les bibliothèques dans un seul exécutable autonome. 'g ++ -static' – Mikhail

Répondre

3

Utilisez install_name_tool pour changer le chemin. Vous pouvez ne pas être en mesure d'insérer un chemin plus long si l'éditeur de liens n'a pas ajouté de remplissage, mais vous pouvez utiliser un rpath à la place. Par exemple, je modifier le chemin de charge pour une application sur mon système pour utiliser le SDK 10.5 en faisant:

install_name_tool -change /usr/lib/libstdc++.6.dylib @rpath/libstdc++.6.dylib /path/to/executable 
install_name_tool -add_rpath /Developer/SDKs/MacOSX10.5.sdk/usr/lib /path/to/executable 

et il a fonctionné très bien après le fait. Je ne voudrais pas faire de promesses, mais en supposant que vous ayez compilé le SDK 10.5 initialement, vous avez une chance.

Si vous avez besoin de voir les chemins que l'exécutable utilise, otool -L les listera.

+0

En arrière, STD C++ n'est peut-être pas le meilleur cas de test, mais ça vaut quand même le coup. –

+1

Je viens de réaliser que OP a demandé une variable d'environnement. Si le chemin de chargement est modifié en référence à @rpath, DYLD_LIBRARY_PATH doit être une option. –

+0

Je n'ai jamais réussi à vérifier cela a fonctionné, mais d'après ce que j'ai appris, il semble que la bonne réponse. –

0

Il est peu probable que cela soit possible, étant donné qu'OS X n'a ​​pas de noyau stable ABI. Au lieu de cela, l'ABI stable est celle fournie par les bibliothèques système. Par conséquent, l'utilisation de bibliothèques système d'une version différente de celle du noyau peut être endommagée. (Je ne sais pas à quel point il se casse.)

Voir http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html

-1

Essayez ceci:

  1. Ouvrez votre projet dans Xcode.
  2. Sous Exécutables dans les groupes & colonne fichiers, un clic droit sur l'exécutable de votre application et sélectionnez Obtenir des informations
  3. Sélectionnez l'onglet Arguments
  4. Dans la moitié inférieure de la fenêtre, sous la rubrique « Variables à l'environnement : ", cliquez sur le bouton +.
  5. Dans la ligne qui apparaît dans le tableau, entrez DYLD_LIBRARY_PATH sous Nom et entrez le chemin (par exemple /Developer/SDKs/MacOSX10.5.sdk/usr/lib) sous Valeur.

Maintenant, vous avez configuré votre variable d'environnement de chemin de liaison. Cette variable d'environnement sera définie pour vous lorsque vous exécutez cet exécutable à partir de Xcode. Pour tester votre application, allez dans le menu Exécuter et sélectionnez "Exécuter". Si vous exécutez l'application en double-cliquant dessus directement dans le Finder, vous n'obtiendrez pas cette variable d'environnement définie pour vous. Le paramètre ne prend effet que lorsque vous exécutez Xcode.

Voici la documentation d'Apple sur ce processus:

http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/XcodeProjectManagement/230-Defining_Executable_Environments/executable_environments.html

+0

Comme je l'ai dit dans la question, DYLD_LIBRARY_PATH n'aide pas. Vous avez répondu à la question "Comment définir DYLD_LIBRARY_PATH dans Xcode", ce qui n'est pas ce que j'ai demandé (notamment parce que je n'utilise pas xcode). –

+0

C'est vrai. J'ai déjà eu DYLD_LIBRARY_PATH dans le passé, donc mon hypothèse était que vous ne configuriez pas la variable d'environnement correctement dans Xcode. Je n'ai pas réalisé que vous n'utilisiez pas Xcode. Qu'est-ce que vous utilisez pour construire, alors? Juste curieux. En y réfléchissant, vous n'avez pas mentionné comment vous savez que vos tentatives pour charger le dylib alternatif ont été infructueuses. Pouvez-vous donner un peu plus d'informations à ce sujet? – Ryan