Di mana saya mengatur DYLD_LIBRARY_PATH di Mac OS X, dan apakah itu ide yang bagus?

28

Saya mencoba menginstal solver yang ditulis dalam C ++ pada Mac saya (OS X), untuk digunakan dengan kode yang saya tulis dalam XCode.

Dokumentasi solver mengatakan ini:

Pastikan untuk memiliki "." dalam DYLD_LIBRARY_PATHrangka untuk

  • jalankan executable yang sudah dibangun
  • tautan dengan libamg.dylib (dan RTSlibs gfortran)

Saya tidak begitu mengerti apa artinya ini. Di mana dan apa yang harus saya ubah?

Saya telah melakukan beberapa googling, tetapi belum menemukan apa pun yang cukup sederhana untuk pemula seperti saya! Jika ada orang yang sabar di luar sana yang tidak keberatan mengarahkan saya ke sumber daya online atau memberi saya ab-cs tentang bagaimana dan di mana mengatur variabel lingkungan, saya akan sangat berterima kasih.

Semut
sumber

Jawaban:

20

Ini adalah variabel lingkungan dan karena itu biasanya ditetapkan di Terminal oleh

export DYLD_LIBRARY_PATH=someValue

man dyld mengatakan:

DYLD_LIBRARY_PATH

Ini adalah daftar direktori yang dipisahkan oleh titik dua yang berisi perpustakaan. Linker dinamis mencari direktori ini sebelum mencari lokasi default untuk perpustakaan. Ini memungkinkan Anda untuk menguji versi baru dari perpustakaan yang ada.

Untuk setiap pustaka yang digunakan suatu program, penghubung dinamis mencarinya di setiap direktori DYLD_LIBRARY_PATHsecara bergantian. Jika masih tidak dapat menemukan perpustakaan, maka pencarian DYLD_FALLBACK_FRAMEWORK_PATHdan DYLD_FALLBACK_LIBRARY_PATHpada gilirannya.

Gunakan -Lopsi untuk otool(1). untuk menemukan kerangka kerja dan perpustakaan bersama yang dieksekusi terkait dengan.


Anda mungkin menginginkan sesuatu seperti

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

untuk menambahkan .(direktori saat ini) ke daftar lokasi yang dicari. Pada OS X saya yang tidak dimodifikasi, DYLD_LIBRARY_PATHtidak memiliki nilai saat ini:

$ echo $DYLD_LIBRARY_PATH

$

Bergantung pada bagaimana Anda bermaksud menjalankan program Anda, Anda perlu mengatur ini secara berbeda, misalnya dalam Xcode (saya tidak tahu di mana).

Daniel Beck
sumber
1
Saya setuju dengan @TVNshack bahwa Anda biasanya tidak boleh mengatur DYLD_LIBRARY_PATHatau DYLD_FRAMEWORK_PATH, karena dapat mencegah lib yang dimuat untuk menemukan lib yang disediakan sistem. Untuk membuatnya lebih baik, gunakan FALLBACKversinya. Info lebih lanjut dalam jawaban ini: stackoverflow.com/a/3172515/43615
SuperTempel
21

Seseorang seharusnya tidak pernah mengatur export DYLD_LIBRARY_PATHpada sistem Anda.

Jalur perpustakaan bersama dapat diperbaiki menggunakan otool -Ldan install_name_tool.

Misalnya, jika Anda mengkompilasi Perl DBD-MySQL Anda tidak akan dapat menggunakannya karena linker tidak tahu di mana Anda menginstal MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

Ini sesederhana itu.

TVNshack
sumber
FYI Cepat: install_name_tool gagal dengan diam-diam jika jalur baru lebih panjang dari jalur yang diganti. Selalu verifikasi dengan 'otool -L' bahwa jalurnya diubah seperti yang diharapkan.
user15685
Katakanlah saya mengkompilasi Plug In (Pada dasarnya Perpustakaan Dinamis dengan sendirinya) yang tergantung pada Perpustakaan Dinamis lain. Bagaimana saya harus menyediakan Plug In dan dependensinya untuk pengguna lain?
Royi
Jika Anda malah mengatur DYLD_FALLBACK_FRAMEWORK_PATH, itu tidak bekerja dalam kasus ini. Itu jauh lebih mudah daripada mengubah jalur internal libs, terutama jika Anda perlu mengirimkan dylibs yang dibangun dengan aplikasi Anda dan tidak dapat memprediksi jalur akhirnya.
SuperTempel
7

Di Xcode 4 Anda dapat menambahkannya ke Skema proyek untuk menghindari kesalahan seperti ini:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. Dalam Menu klik pada "Produk" -> "Edit Skema" -> "Tab Argumen" -> Tambahkan "Variabel Lingkungan" -> Kunci: DYLD_LIBRARY_PATH Nilai: / Pengguna / MyUserAccount / path / ke / lib

  2. Ubah jalur ke akun pengguna Anda dan jalur lengkap ke folder perpustakaan.

  3. Anda harus dapat membangun dan menjalankan.

Mengatur DYLD_LIBRARY_PATH di Xcode 4

Paul Solt
sumber