динамическая компоновка scons dylib на mac

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

Пример:

источник/main.cpp

инструмент/lib/libboost_system.dylib

Бинарное местоположение

исходник/прогбинарий

Моя проблема в том, что после процесса компоновки бинарник не может найти libboost_system.dylib

dyld: библиотека не загружена: libboost_system.dylib

otool -L показывает проблему. Я могу исправить это с помощью небольшого скрипта, который исправляет путь. Но я хочу сделать это в scons.

В Linux это очень просто, мне нужно только установить RPATH в scons.

----- после подсказки от @Brady

Я добавляю Linkflags для моей библиотеки. После привязки я получил ошибку

'g++: ошибка: -install_name разрешено только с -dynamiclib'

Поэтому я добавляю к команде

LINKFLAGS = '-dynamiclib install_name @executable_path/libWhatever.dylib'

И теперь я получаю, если я позвоню своему выполнению сообщения

'не удается выполнить бинарный файл'

И

отул -L

Покажите мне:

@executable_path/tools/lib/libboost_filesystem.dylib (версия совместимости 0.0.0, текущая версия 0.0.0) libboost_system.dylib (версия совместимости 0.0.0, текущая версия 0.0.0)

команда связывания из scons выглядит так:

/opt/local/bin/g++ -o source/prog -dynamiclib -install_name @executable_path/tools/lib/libboost_system.dylib source/main.o -Ltools/lib -lboost_system


person chak    schedule 28.10.2013    source источник
comment
Вам нужно получить параметры командной строки от -install_name @executable_path/libWhatever.dylib до ld. С make это потребует установки LDFLAGS, однако я не знаю, как это сделать с scons.   -  person trojanfoe    schedule 29.10.2013


Ответы (1)


Согласно приведенному выше комментарию trojanfoe: динамическое связывание scons dylib на mac

Компоновщику необходимо передать следующее:

-install_name @executable_path/libWhatever.dylib

Это можно сделать в SCons следующим образом:

env = Environment()
env.Append(LINKFLAGS = ['-install_name @executable_path/libWhatever.dylib'])

Если вам нужно скомпилировать динамическую (общую) библиотеку, это можно сделать с помощью ссылки построитель SharedLibrary().

person Brady    schedule 29.10.2013
comment
Спасибо за помощь. Проблема немного изменилась после использования вашего совета. я отредактировал сообщение выше - person chak; 30.10.2013
comment
@chak, я добавил в ответ информацию о компиляции с использованием общих библиотек. Надеюсь, это поможет. Я недостаточно знаю о компиляции на Mac, чтобы иметь возможность помочь гораздо больше. Если это не сработает, вам следует подумать о том, чтобы задать другой вопрос о компиляции на Mac. - person Brady; 31.10.2013