Как изменить имя установки .dylib во время сборки

Я создаю библиотеку флагов командной строки google-gflags для C++ в Mac OS X (10.7 .1). Процесс сборки такой:

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

Я хотел бы изменить имя установки сгенерированной общей библиотеки во время сборки и не использовать install_name_tool впоследствии.

По умолчанию имя установки сгенерированной разделяемой библиотеки, libgflags.dylib, является выходным путем:

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

На странице руководства для ld(1) есть параметр -install_name, который можно использовать для изменения имени установки динамической библиотеки во время компоновки.

Например, с фиктивной программой:

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

Но я не могу использовать этот параметр командной строки со сценарием ./configure. Я пытался вручную установить переменную CFLAGS, но это приводит к ошибке:

$ 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

Итак, могу ли я изменить имя установки .dylib, сгенерированное configure и make, без использования install_name_tool?


person v8891    schedule 24.08.2011    source источник
comment
Я не понимаю, что вы пытаетесь сделать. Почему нельзя просто запустить ./configure --prefix /tmp/desired/location?   -  person adl    schedule 24.08.2011
comment
Это правильный вопрос. Я не могу установить --prefix в это место по разным причинам, в том числе из-за того, что место моей сборки отличается от места установки моего приложения. Я просто хочу передать соответствующий флаг компоновщика при использовании configure.   -  person v8891    schedule 24.08.2011
comment
Ваш сценарий мне до сих пор не ясен. Не могли бы вы объяснить, почему стандартный ./configure --prefix /somewhere && make && make install не подходит для вашей установки? Почему ваше место сборки имеет значение? (Конечно, вы должны использовать абсолютный префикс.) Вы пытаетесь создать ссылку на libglflags, не устанавливая его? (В этом случае вы должны использовать libtool, чтобы связать свое приложение с libflag.la, и позволить libtool сделать свое волшебство, чтобы связать неустановленную библиотеку.) Вы хотите установить библиотеку во временное местоположение, прежде чем она будет скопирована в ее окончательное местоположение? (Это работа для переменной DESTDIR.)   -  person adl    schedule 25.08.2011
comment
Сотрудники Apple рекомендуют использовать -headerpad_max_install_names для компиляции и компоновки. Затем, когда вы make install, вы используете install_name_tool для обновления записи, чтобы она указывала на полное имя пути ( то есть, /usr/local/lib/libfoo.dylib). Ник X в основном ответил так же, но не упомянул рекомендацию Apple или -headerpad_max_install_names.   -  person jww    schedule 02.03.2016


Ответы (2)


Как правило, передача аргументов компоновщика через g++ должна начинаться с -Wl, а пробелы должны быть заменены запятыми. Итак, если вы хотите передать "-install_name /tmp/temp.dylib" компоновщику, вам нужно будет вызвать это:

g++ -Wl,-install_name,/tmp/temp.dylib ...
person Ben    schedule 29.08.2012

одним из возможных подходов было бы ручное редактирование config.status. но прежде чем я попытаюсь это сделать, install_name_tool -id спас мне жизнь.

person Nick X    schedule 30.10.2012