2010-10-04 746 views
6

Resumen

Quiero ejecutar mi aplicación compilada cruzada contra las 10.5 bibliotecas. ¿Hay alguna variable ambiental que permita que esto funcione?¿Ejecutar aplicaciones contra un SDK diferente en OS X?

ya la versión

I cruzada compilado mi OS X aplicación C++ para un objetivo 10.5, 10.6 en un host. Compila bien. La aplicación compilada está vinculada a bibliotecas como /usr/lib/libstdc++.6.dylib. Cuando lo ejecuto en mi sistema, usará la versión 'host' de las bibliotecas, que son 10.6. Me gustaría probarlo con las versiones 10.5, que están todas contenidas en el directorio `/Developer/SDKs/MacOSX10.5.sdk. ¿Cómo hago esto?

Probé varios sabores de DYLD_LIBRARY_PATH, DYLD_ROOT_PATH, etc., como documented in the manual, pero no he conseguido que funcione.

+1

Muy buena pregunta, no tengo una respuesta, me encantaría escuchar a uno. – jv42

+0

No sé la respuesta tampoco, pero C++ se puede compilar fácilmente como un binario * estático *: incluirá todas las bibliotecas en un único ejecutable independiente. 'g ++ -static' – Mikhail

Respuesta

3

Uso install_name_tool para cambiar la ruta. Es posible que no pueda exprimir una ruta más larga si el enlazador no agregó relleno, pero puede usar un rpath en su lugar. Por ejemplo, puedo cambiar la ruta de carga para una aplicación en mi sistema para utilizar el SDK 10.5 haciendo:

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 

y funcionó muy bien después del hecho. No quisiera asegurarme, pero asumiendo que compiló inicialmente el 10.5 SDK, tiene una oportunidad.

Si necesita ver las rutas que está utilizando el ejecutable, otool -L las listará.

+0

A posterior vista, STD C++ puede no ser el mejor caso de prueba, pero aún así vale la pena intentarlo. –

+1

Me acabo de dar cuenta de que OP solicitó una variable de entorno. Si la ruta de carga se cambia a una referencia a @rpath, DYLD_LIBRARY_PATH debería ser una opción. –

+0

Nunca llegué a verificar que esto funcionó, pero por lo que he aprendido, parece ser la respuesta correcta. –

0

Es poco probable que esto sea posible, dado que OS X no tiene un núcleo estable ABI. En cambio, el ABI estable es el proporcionado por las bibliotecas del sistema. Por lo tanto, el uso de bibliotecas del sistema de una versión diferente a la del kernel puede romperse. (No sé hasta qué punto se rompe.)

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

-1

Prueba esto:

  1. abrir el proyecto en Xcode.
  2. Bajo ejecutables de la columna Grupos & archivos, haga clic en ejecutable de la aplicación y seleccione Obtener información
  3. Seleccione la pestaña Argumentos
  4. En la mitad inferior de la ventana, bajo "Variables que se fijará en el entorno : ", haz clic en el botón +.
  5. En la fila que se muestra en la tabla, ingrese DYLD_LIBRARY_PATH en Nombre e ingrese la ruta (por ejemplo,/Desarrollador/SDKs/MacSX10.5.sdk/usr/lib) en Valor.

Ahora tiene configurada su variable de entorno de ruta de enlace. Esta variable de entorno se configurará para usted cuando ejecute ese ejecutable desde dentro de Xcode. Para probar tu aplicación, solo ve al menú Ejecutar y selecciona "Ejecutar". Si ejecuta la aplicación haciendo doble clic directamente en el Finder, no obtendrá esta variable de entorno establecida para usted. La configuración solo tiene efecto cuando se ejecuta desde Xcode.

Aquí está la documentación de Apple en este proceso:

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

+0

Como dije en la pregunta, DYLD_LIBRARY_PATH no ayuda. Has respondido a la pregunta "¿Cómo configuro DYLD_LIBRARY_PATH en Xcode?", Que no es lo que pregunté (no menos porque no uso xcode). –

+0

Eso es verdad. He tenido DYLD_LIBRARY_PATH trabajo para mí en el pasado, por lo que mi hipótesis fue que no estaba configurando la variable de entorno correctamente en Xcode. No me di cuenta de que no estabas usando Xcode. ¿Qué estás usando para construir, entonces? Sólo curioso. Ahora que lo pienso, no has mencionado cómo sabes que tus intentos de cargar el dylib alternativo no han tenido éxito. ¿Puedes darnos un poco más de información sobre eso? – Ryan