2011-08-24 17 views
7

Estoy construyendo la biblioteca de indicadores de línea de comandos google-gflags para C++ en Mac OS X (10.7.1). El proceso de construcción es como tal:Cómo modifico el nombre de instalación de un .dylib en el momento de compilación

$ ./configure --prefix=output 
$ make 
$ make install 

me gustaría cambiar el nombre de la instalación de la biblioteca compartida generada en tiempo de compilación y no utilizar install_name_tool después.

Por defecto, el install name de la biblioteca compartida generada, libgflags.dylib, es la ruta de salida:

$ otool -L ./output/libgflags.dylib 
$ ./output/libgflags.dylib: 
    /tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

La página del manual para ld(1) tiene una opción -install_name que se puede utilizar para cambiar el nombre de la instalación de una dinámica biblioteca en tiempo de enlace.

Por ejemplo, con un programa simulado:

$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib 
$ otool -L temp.dylib 
temp.dylib: 
    /tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

Pero, no soy capaz de usar esta opción de línea de comandos con el guión ./configure. He intentado manualmente estableciendo la variable de CFLAGS, pero que resulta en un error:

$ CFLAGS="-install_name /tmp/desired/location/libgflags.dylib" ./configure 
checking for a BSD-compatible install... /opt/local/bin/ginstall -c 
checking whether build environment is sane... yes 
checking for gawk... no 
checking for mawk... no 
checking for nawk... no 
checking for awk... awk 
checking whether make sets $(MAKE)... yes 
checking for gcc... gcc 
checking whether the C compiler works... no 
configure: error: in `/Users/vibhav/Code/install_name_test/gflags-1.5': 
configure: error: C compiler cannot create executables 

Por lo tanto, ¿es posible para mí para cambiar el nombre de instalar .dylib generada por configure y sin utilizar makeinstall_name_tool?

+0

No entiendo lo que estás tratando de hacer. ¿Por qué no puedes simplemente ejecutar './configure --prefix/tmp/desired/location'? – adl

+0

Esa es una pregunta válida. No puedo establecer '--prefix' en esa ubicación por varias razones, incluyendo que mi ubicación de compilación es diferente de la ubicación de" instalación "de mi aplicación. Simplemente quiero pasar el indicador del enlazador apropiado mientras uso 'configure'. – v8891

+0

Su escenario aún no está claro para mí. ¿Podría explicarnos cómo el estándar './configure --prefix/somewhere && make && make install' es incorrecto para su configuración? ¿Por qué importaría tu ubicación de construcción? (Debería usar un prefijo absoluto, por supuesto.) ¿Está tratando de vincular a 'libglflags' sin instalarlo? (En ese caso, debe usar 'libtool' para vincular su aplicación con' libflag.la' y dejar que libtool haga su magia para enlazar con una biblioteca no instalada.) ¿Desea instalar la biblioteca en una ubicación temporal antes de que sea copiado a su ubicación final? (Es un trabajo para la variable DESTDIR.) – adl

Respuesta

5

En general, pasar argumentos del enlazador a través de g ++ debe ir precedido de -Wl y los espacios deben reemplazarse por comas. Por lo tanto, si desea pasar "/tmp/temp.dylib -install_name" al enlazador que tendrá que llamar a esto:

g++ -Wl,-install_name,/tmp/temp.dylib ... 
4

un posible enfoque sería editando el config.status manualmente. pero antes de intentar hacer eso, install_name_tool -id me salvó la vida.

Cuestiones relacionadas