2011-07-15 31 views
5

Tôi đang sử dụng setenv để đặt DYLD_LIBRARY_PATH vì vậy khi tôi làm dlopen() nó sẽ có đường dẫn chính xác để tìm .dylib của tôi, nhưng khi tôi làm dlopen() nó không dường như không tìm kiếm đường dẫn mà tôi đã thêm vào DYLD_LIBRARY_PATH.Các vấn đề với việc sử dụng setenv và sau đó thực hiện cuộc gọi dlopen

Từ những gì tôi có thể thu thập các thay đổi của mình sang DYLD_LIBRARY_PATH sẽ không có hiệu lực cho đến khi thực hiện lại quy trình của tôi. Điều này có đúng không?

Ngoài ra nếu điều đó là chính xác, có cách nào để đặt DYLD_LIBRARY_PATH và có thay đổi của tôi làm việc với ra làm một thiết lập lại quá trình của tôi.

Ồ vâng tôi viết mã này trên MAC OSX.

Xin cảm ơn trước.

Trả lời

2

Câu trả lời cho câu hỏi của tôi là không, bạn không thể sử dụng setenv mà không thực hiện lại quá trình trên LD_LIBRARY_PATH cho biến môi trường có hiệu lực trên dlopen.

Tôi phát hiện ra rằng bạn nên sử dụng @exectuable_path, @loader_path hoặc @rpath làm đường dẫn cài đặt trên .dylb của tôi là cách này bạn có thể thực hiện tìm kiếm đường dẫn tương đối trên .dylibs của bạn từ dlopen.

4

Tôi không biết về Mac OS, nhưng trên Linux, trình tải đọc giá trị getenv("LD_LIBRARY_PATH")sau khi và lưu nó đi, trước khi lệnh đầu tiên chạy thực thi của bạn. Sửa đổi tiếp theo của LD_LIBRARY_PATH bởi chương trình chỉ ảnh hưởng đến bất kỳ trẻ em nào execve() s, nhưng không ảnh hưởng đến quá trình. Tôi tưởng tượng nó tương tự trên Mac OS.

Cách thông thường xung quanh việc này là hoặc là execve các yêu cầu (Java thực hiện điều này) hoặc sử dụng trình bao bọc trình thiết lập môi trường và sau đó thực thi nhị phân thực (Firefox thực hiện điều đó).

Có thể có cách cụ thể của Mac OS để cập nhật đường dẫn tìm kiếm thư viện, mặc dù Google dường như không tìm thấy bất kỳ kết quả phù hợp nào. Tôi chắc chắn có không phải là bất kỳ cơ chế nào như vậy trên Linux.

+0

Hiện tại, phần mềm của chúng tôi thực hiện lại việc thiết lập LD_LIBRARY_PATH với các đường dẫn bổ sung của chúng tôi. Tôi đã cố gắng để làm điều đó mà không tái thực hiện, nhưng có lẽ đó là cách duy nhất trên hệ điều hành MAC. Điều này làm cho nó khó khăn hơn nhiều để gỡ lỗi vì việc sửa lỗi Xcode bị gián đoạn giữa lần thực hiện đầu tiên và lần thứ hai. –

+0

Java thực thi lại IFF LD_LIBRARY_PATH hiện tại chưa chính xác. Chương trình của bạn phải làm như vậy, hoặc nó sẽ nhập vòng lặp vô hạn. Vì vậy, để gỡ lỗi nó, thiết lập LD_LIBRARY_PATH đến những gì nó đã có thể được thiết lập trước khi tái exec (có lẽ trước khi bắt đầu Xcode), và gỡ lỗi đi. –

Các vấn đề liên quan