Tôi có thể đặt DYLD_LIBRARY_PATH ở đâu trên Mac OS X và đó có phải là một ý tưởng hay không?


28

Tôi đang cố gắng cài đặt một bộ giải được viết bằng C ++ trên máy Mac (OS X) của tôi, để sử dụng với mã tôi đã viết bằng XCode.

Các tài liệu giải quyết nói điều này:

Hãy chắc chắn có "." trong của bạn DYLD_LIBRARY_PATHđể

  • chạy các tệp thực thi đã sẵn sàng
  • liên kết với libamg.dylib (và RTSlibs gfortran)

Tôi thực sự không hiểu điều này có nghĩa là gì. Tôi cần thay đổi ở đâu và làm gì?

Tôi đã thực hiện một số việc, nhưng không bắt gặp bất cứ điều gì đủ đơn giản cho một người mới như tôi! Nếu có bất kỳ người kiên nhẫn nào ngoài kia không muốn hướng tôi đến một tài nguyên trực tuyến hoặc đưa cho tôi ab-cs về cách thức và nơi để đặt các biến môi trường, tôi sẽ rất biết ơn.

Câu trả lời:


20

Đây là một biến môi trường và như vậy thường được đặt trong Terminal bởi

export DYLD_LIBRARY_PATH=someValue

man dyld nói:

DYLD_LIBRARY_PATH

Đây là một danh sách các thư mục được phân tách bằng dấu hai chấm có chứa các thư viện. Trình liên kết động tìm kiếm các thư mục này trước khi nó tìm kiếm các vị trí mặc định cho các thư viện. Nó cho phép bạn kiểm tra các phiên bản mới của các thư viện hiện có.

Đối với mỗi thư viện mà một chương trình sử dụng, trình liên kết động DYLD_LIBRARY_PATHlần lượt tìm kiếm nó trong từng thư mục . Nếu nó vẫn không thể tìm thấy thư viện, thì nó sẽ tìm kiếm DYLD_FALLBACK_FRAMEWORK_PATHDYLD_FALLBACK_LIBRARY_PATHlần lượt.

Sử dụng -Ltùy chọn để otool(1). để khám phá các khung và các thư viện dùng chung mà tệp thực thi được liên kết với.


Bạn có thể muốn một cái gì đó như

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

để thêm vào .(thư mục hiện tại) vào danh sách các địa điểm được tìm kiếm. Trên OS X chưa sửa đổi của tôi, DYLD_LIBRARY_PATHkhông có giá trị hiện tại:

$ echo $DYLD_LIBRARY_PATH

$

Tùy thuộc vào cách bạn định chạy chương trình của mình, bạn cần đặt chương trình này khác đi, ví dụ như trong Xcode (mặc dù tôi không biết ở đâu).


1
Tôi đồng ý với @TVNshack rằng bạn thường không nên đặt DYLD_LIBRARY_PATHcũng không được DYLD_FRAMEWORK_PATH, bởi vì điều đó có thể ngăn những lib được tải đó tìm các lib do hệ thống cung cấp. Để làm cho nó hoạt động tốt hơn, sử dụng thay vì các FALLBACKphiên bản. Thông tin thêm trong câu trả lời này: stackoverflow.com/a/3172515/43615
SuperTempel

21

Không bao giờ nên thiết lập export DYLD_LIBRARY_PATHtrên hệ thống của bạn.

Đường dẫn thư viện dùng chung có thể được sửa bằng cách sử dụng otool -Linstall_name_tool.

Chẳng hạn, nếu bạn biên dịch Perl DBD-MySQL, bạn sẽ không thể sử dụng nó vì trình liên kết không biết bạn đã cài đặt MySQL ở đâu.

># 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

Điều này là đơn giản như vậy.


FYI nhanh: install_name_tool không thành công nếu đường dẫn mới dài hơn đường dẫn thay thế. Luôn xác minh với 'otool -L' rằng đường dẫn đã được thay đổi như mong đợi.
dùng15685

Giả sử tôi biên dịch Plug-in (Về cơ bản là Thư viện động) phụ thuộc vào Thư viện động khác. Tôi nên cung cấp Plug In và các phụ thuộc của nó cho người dùng khác như thế nào?
Royi

Nếu bạn thay vì thiết lập DYLD_FALLBACK_FRAMEWORK_PATH, nó không làm việc trong trường hợp này. Điều đó dễ dàng hơn nhiều so với việc thay đổi đường dẫn nội bộ của libs, đặc biệt là nếu bạn cần phân phối các dylib được xây dựng với ứng dụng của mình và không thể dự đoán đường dẫn mà chúng kết thúc.
SuperTempel

7

Trong Xcode 4, bạn có thể thêm nó vào Lược đồ dự án để tránh các lỗi như thế này:

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. Trong Menu, nhấp vào "Sản phẩm" -> "Chỉnh sửa lược đồ" -> tab "Đối số" -> Thêm "Biến môi trường" -> Khóa: DYLD_LIBRARY_PATH Giá trị: / Users / MyUserAccount / path / to / lib

  2. Thay đổi đường dẫn đến tài khoản người dùng của bạn và đường dẫn đầy đủ đến thư mục thư viện.

  3. Bạn sẽ có thể xây dựng và chạy.

Đặt DYLD_LIBRARY_PATH trong Xcode 4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.