Как создать ссылку на абсолютный путь в dylib?

[Отказ от ответственности: я работаю с чужим кодом. Я никогда не создавал.dylib, поэтому я перехожу к SO]

Я работаю над дистрибутивом, который создает.dylib. Это выглядит хорошо, но когда я ссылаюсь на него, получающийся исполняемый файл вылетает с:

dyld: Library not loaded: libstk.dylib.4.4.4
  Referenced from: /Users/r/Projects/Mu/examples/./mune31
  Reason: image not found 
Trace/BPT trap: 5

Когда я проверяю исполняемый файл с otool, проблема ясна: libstk (рядом с последней записью) имеет относительный путь, а не абсолютный путь. (Кроме того, у него нет совместимости или не установлены правильные текущие версии.)

Mu[~/Projects/Mu/examples]$ otool -L ./mune31
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
        /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
        /Users/r/Projects/Mu/usr/lib/libgsl.0.dylib (compatibility version 18.0.0, current version 18.0.0)
        libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

вопрос

Этот дистрибутив использует g++ (а не clang) для своего компилятора. Текущее заклинание, которое создает.dylib:

g++  -fPIC -dynamiclib -o libstk.dylib.4.4.4 Release/*.o -lpthread -framework CoreAudio -framework CoreFoundation -framework CoreMidi
install -m 644 libstk.dylib.4.4.4 /Users/r/Projects/Mu/usr/lib

Что следует читать вместо этого, чтобы создать.dylib с абсолютным путем?

Обновить

По причинам обратной совместимости мы бы предпочли оставить dylib с относительным именем при его сборке (т.е. мы не хотим передавать аргумент -install_name в g++ -fPIC ... команда).

Есть ли способ настроить dylib после его создания, чтобы иметь абсолютный путь? Когда я запускаю otool -L для существующего файла, я вижу:

$ otool -L libstk.dylib.4.4.4
libstk.dylib.4.4.4:
    libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 855.16.0)
    /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI (compatibility version 1.0.0, current version 73.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)

Я хотел бы, чтобы первая строка была

    /MySandbox/whatever/libstk.dylib.4.4.4 (compatibility version 0.0.0, current version 0.0.0)

п.с.

Если кто-то нетерпелив, как и я, вы можете использовать install_name_tool как обходной путь для обновления исполняемого файла следующим образом:

install_name_tool -change libstk.dylib.4.4.4 ../usr/lib/libstk.dylib.4.4.4 mune31

... но было бы неплохо не делать это каждый раз, когда я собираю исполняемый файл.

1 ответ

Решение

Вы можете использовать -id вариант install_name_tool изменить идентификатор dylib перед тем, как связать свой исполняемый файл. Компоновщик использует идентификатор как ссылку на библиотеку, которая запекается в исполняемом файле.

Когда вы ожидаете использовать install_name_tool чтобы изменить пути в двоичном файле, вы должны указать один из следующих параметров компоновщика: -headerpad <size> или же -headerpad_max_install_names,

Другие вопросы по тегам