Додайте шлях до місця, куди спрямована ваша нова бібліотека LD_LIBRARY_PATH
(вона має трохи іншу назву на Mac ...)
Ваше рішення має працювати з використанням -L/my/dir -lfoo
параметрів, під час виконання використовуйте LD_LIBRARY_PATH, щоб вказати місце розташування вашої бібліотеки.
Обережно з використанням LD_LIBRARY_PATH - коротше (із посилання):
..імплікації ..:
Безпека : Пам'ятайте, що каталоги, вказані в LD_LIBRARY_PATH, шукаються до (!) стандартних розташувань? Таким чином, неприємна людина може отримати вашу програму для завантаження версії спільної бібліотеки, яка містить шкідливий код! Це одна з причин, чому виконувані файли setuid / setgid нехтують цією змінною!
Продуктивність: Завантажувач посилань повинен здійснити пошук у всіх зазначених каталогах, поки не знайде каталог, в якому знаходиться спільна бібліотека - для ВСІХ спільних бібліотек, до яких додаток пов’язаний! Це означає багато системних дзвінків до open (), які не вдасться виконати “ENOENT (немає такого файлу або каталогу)”! Якщо шлях містить багато каталогів, кількість невдалих викликів буде лінійно збільшуватись, і це можна буде визначити з часу запуску програми. Якщо деякі (або всі) каталоги перебувають у середовищі NFS, час запуску ваших програм дійсно може збільшитися - і це може сповільнити роботу всієї системи!
Невідповідність: Це найпоширеніша проблема. LD_LIBRARY_PATH змушує програму завантажувати спільну бібліотеку, з якою вона не була пов’язана, і яка, швидше за все, не сумісна з оригінальною версією. Це може бути дуже очевидним, тобто збій програми, або може призвести до неправильних результатів, якщо підібрана бібліотека не зовсім відповідає тому, що зробила б оригінальна версія. Особливо останнє часом важко налагодити.
АБО
Використовуйте параметр rpath через gcc для компонування - шлях пошуку в бібліотеці виконання буде використовуватися замість того, щоб шукати в стандартній директорії (параметр gcc):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
Це добре для тимчасового рішення. Linker спочатку шукає бібліотеки LD_LIBRARY_PATH, перш ніж переглядати стандартні каталоги.
Якщо ви не хочете постійно оновлювати LD_LIBRARY_PATH, ви можете зробити це на льоту в командному рядку:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Ви можете перевірити, що бібліотека знає про використання (приклад):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
І ви можете перевірити, яку бібліотеку використовує ваша програма:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
файли існують і де -.so
б / н.0
,.a
і т.д. і т.п.?