2010-10-04 15 views
6

Tóm tắt

Tôi muốn chạy ứng dụng được biên dịch chéo của tôi đối với các thư viện 10.5. Có một biến môi trường cho phép điều này hoạt động không?Chạy các ứng dụng chống lại một SDK khác trong OS X?

Phiên bản dài hơn

Tôi đã biên soạn ứng dụng OS X C++ cho mục tiêu 10.5 trên máy chủ 10.6. Nó biên dịch tốt. Ứng dụng đã biên dịch được liên kết với các thư viện như /usr/lib/libstdc++.6.dylib. Khi tôi chạy nó trên hệ thống của mình, nó sẽ sử dụng phiên bản 'máy chủ' của các thư viện, là 10.6. Tôi muốn thử nghiệm nó với các phiên bản 10.5, tất cả đều nằm trong thư mục `/Developer/SDKs/MacOSX10.5.sdk. Làm thế nào để tôi làm điều này?

Tôi đã thử nhiều hương vị khác nhau của DYLD_LIBRARY_PATH, DYLD_ROOT_PATH, v.v., như documented in the manual, nhưng tôi chưa quản lý để làm cho nó hoạt động.

+1

câu hỏi Rất tốt, tôi không có một câu trả lời, rất thích nghe một. – jv42

+0

Cũng không biết câu trả lời, nhưng C++ có thể dễ dàng được biên dịch dưới dạng nhị phân * tĩnh * - nó sẽ bao gồm tất cả các thư viện trong một tệp thực thi độc lập. 'g ++ -static' – Mikhail

Trả lời

3

Sử dụng install_name_tool để thay đổi đường dẫn. Bạn có thể không có khả năng ép trong một con đường dài hơn nếu liên kết không thêm đệm, nhưng thay vào đó bạn có thể sử dụng đường nối. Ví dụ: tôi thay đổi đường dẫn tải cho ứng dụng trên hệ thống của tôi để sử dụng SDK 10.5 bằng cách thực hiện:

install_name_tool -change /usr/lib/libstdc++.6.dylib @rpath/libstdc++.6.dylib /path/to/executable 
install_name_tool -add_rpath /Developer/SDKs/MacOSX10.5.sdk/usr/lib /path/to/executable 

và nó chạy tốt sau khi thực tế. Tôi sẽ không muốn thực hiện bất kỳ sự đảm bảo nào, nhưng giả sử bạn đã biên soạn dựa trên 10.5 SDK ban đầu, bạn đã có một cảnh quay.

Nếu bạn cần xem các đường dẫn mà tệp thực thi đang sử dụng, otool -L sẽ liệt kê chúng.

+0

Ở chế độ nhìn sau, STD C++ có thể không phải là trường hợp thử nghiệm tốt nhất, nhưng nó vẫn đáng để quay. –

+1

Tôi vừa nhận ra rằng OP đã yêu cầu một biến môi trường. Nếu đường dẫn tải được thay đổi thành tham chiếu đến @rpath, thì DYLD_LIBRARY_PATH phải là một tùy chọn. –

+0

Tôi không bao giờ có vòng để xác minh điều này làm việc, nhưng từ những gì tôi đã học được, nó có vẻ như câu trả lời đúng. –

0

Rất khó có thể thực hiện điều này, vì OS X không có ABI hạt nhân ổn định. Thay vào đó, ABI ổn định là một ABI được cung cấp bởi các thư viện hệ thống. Do đó, sử dụng thư viện hệ thống của một phiên bản khác với hạt nhân có thể bị hỏng. (Tôi không biết ở mức độ nào nó phá vỡ.)

Xem http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html

-1

Hãy thử điều này:

  1. Mở dự án của bạn trong Xcode.
  2. Theo chương trình chạy trong Groups & tập tin cột, nhấp chuột phải vào ứng dụng của bạn thực thi và chọn Get Info
  3. Chọn Arguments tab
  4. Trong nửa dưới của cửa sổ, dưới "biến được đặt trong môi trường : ", nhấp vào nút +.
  5. Trong hàng hiển thị trong bảng, nhập DYLD_LIBRARY_PATH bên dưới Tên và nhập đường dẫn (ví dụ: /Developer/SDKs/MacOSX10.5.sdk/usr/lib) trong Giá trị.

Bây giờ bạn đã thiết lập biến môi trường đường dẫn liên kết. Biến môi trường này sẽ được đặt cho bạn khi bạn chạy tập tin thực thi đó từ bên trong Xcode. Để kiểm tra ứng dụng của bạn, chỉ cần vào menu Run và chọn "Run". Nếu bạn chạy ứng dụng bằng cách nhấp đúp vào ứng dụng trực tiếp trong Trình tìm kiếm, bạn sẽ không nhận được biến môi trường này cho bạn. Cài đặt này chỉ có hiệu lực khi bạn chạy từ Xcode.

Dưới đây là tài liệu hướng dẫn của Apple trên quá trình này:

http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/XcodeProjectManagement/230-Defining_Executable_Environments/executable_environments.html

+0

Như tôi đã nói trong câu hỏi, DYLD_LIBRARY_PATH không giúp ích gì. Bạn đã trả lời câu hỏi 'Làm cách nào để thiết lập DYLD_LIBRARY_PATH trong Xcode', đó không phải là những gì tôi đã yêu cầu (ít nhất là vì tôi không sử dụng xcode). –

+0

Đó là sự thật. Tôi đã có DYLD_LIBRARY_PATH làm việc cho tôi trong quá khứ, do đó, giả định của tôi là bạn đã không thiết lập các biến môi trường một cách chính xác trong Xcode. Tôi không nhận ra bạn không sử dụng Xcode. Những gì bạn đang sử dụng để xây dựng, sau đó? Chỉ tò mò thôi. Nghĩ lại thì, bạn đã không đề cập đến cách bạn biết rằng nỗ lực của bạn để tải dylib thay thế đã không thành công. Bạn có thể cung cấp thêm một chút thông tin về điều đó không? – Ryan

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