У меня есть libA.so, который зависит от libB.so, который находится в ../libB/ (от libA.c). Я пытаюсь скомпилировать вещи таким образом, что мне не нужно устанавливать какие-либо переменные среды. У меня есть:Как установить путь, который библиотека .so будет искать для других .so библиотек?
cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
Это компилируется в порядке. Когда я запускаю программу, которая загружает Либ с dlopen я получаю:
dyld: Library not loaded: libB.so
Referenced from: libA/libA.so
Reason: image not found
Trace/BPT trap: 5
так Либ не находит libB во время выполнения. Я нашел это решение изменить путь выполнения на Mac OS X:
install_name_tool -смена libB.so @loader_path /../ libB.so libA.so
, но я хотел бы найти решение, которое будет работать как на OS X, так и на Linux. Опять же, я пытаюсь сделать конечного пользователя как можно меньше, поэтому я не хочу, чтобы они устанавливали переменные окружения, и мне нужно использовать cc (для меня это версия LLVM для Apple, версия 4.2 (clang-425.0 .27) (на основе LLVM 3.2svn), и я хотел бы, чтобы он тоже работал на Linux, поэтому предположительно cc = gcc там).
EDIT Моя проблема может быть сложнее, чем я понял. Я делаю эту динамическую библиотеку на C, но пытаюсь использовать ее изнутри python. Я могу использовать libB.so (который не имеет зависимостей) изнутри python без проблем, и когда я загружаю libA.so изнутри python, он находит его (см. Выше), просто в тот момент libA.so понимает, что он не " t знать, где найти libB.so. Если я правильно понимаю ваши ответы ниже, решения зависят от установки пути компоновщика при компиляции исполняемого файла, который в моем случае находится в python.
Невозможно ли установить libA.so, где искать libB.so при компиляции? Я могу сделать это позже с помощью install_name_tool на OSX, но разве не существует способа с компилятором, который будет работать как на OSX, так и на Linux?
Спасибо за вашу помощь. Когда я человек cc, я не вижу никаких вариантов для rpath. К сожалению, я должен использовать cc. Есть идеи? – Dan
Когда вы говорите «cc», вам нужно быть более конкретным. «cc» зависит от системы. В Linux это просто ссылка на «gcc». В любом случае, «rpath» - это вариант компоновщика, а не параметр компилятора. Так что прочитайте его: man ld – kaylum
Если это не ясно. С помощью gcc (и, возможно, вашего cc) параметры могут быть переданы компоновщику с параметром -Wl. – kaylum