2012-12-01 25 views
8

Vì vậy, nếu bạn đã có một nhị phân, bạn có thể thêm một rPath để nó trên OSX sử dụng 'install_name_tool', như vậy:Làm thế nào để bạn thêm một rpath cho một thực thi trong cmake trên xây dựng (không cài đặt) trên OSX?

install_name_tool -add_rpath @executable_path/blah 

xcode thực hiện điều này tự động khi bạn đang xây dựng một gói ứng dụng.

Tôi biết rằng trong cmake bạn có thể sử dụng để thiết lập các install_name của thư viện chia sẻ:

set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath") 

Câu hỏi của tôi là, tương đương này để thêm một rPath đến một nhị phân là gì?

(đối với 'lý do tại sao bạn làm điều đó?'), Hãy xem otool -l trên bất kỳ ứng dụng nào trong Ứng dụng/thư mục của bạn và bạn sẽ thấy nhiều ứng dụng với các mục như:

.
Load command 15 
      cmd LC_RPATH 
     cmdsize 36 
     path @executable_path/../../Frameworks/ 

này được tiêu chuẩn thực hành tôi chỉ cố gắng để làm điều đó trong cmake)

Trả lời

10

Bạn có thể sử dụng một POST_BUILD command để thêm một lệnh LC_RPATH tải để thực thi xây dựng:

add_custom_command(TARGET executable 
    POST_BUILD COMMAND 
    ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/../../Frameworks/" 
    $<TARGET_FILE:executable>) 

Biến số CMAKE_INSTALL_NAME_TOOL chứa đường dẫn đến thực thi install_name_tool dưới Darwin.

+2

Theo kinh nghiệm của tôi, giải pháp này gây ra lỗi trên bất kỳ công trình xây dựng nào sau lần xây dựng đầu tiên từ một thư mục sạch. Lệnh POST_BUILD tùy chỉnh chạy trên mọi bản dựng cho dù mục tiêu đã lỗi thời hay không và install_name_tool trả về trạng thái thoát khác 0 và hiển thị thông báo rằng giá trị đường dẫn được thêm đã tồn tại trong tệp đích (vì nó được thêm vào trong lần xây dựng đầu tiên). Tài liệu của CMake dường như chỉ ra rằng lệnh POST_BUILD sẽ chỉ chạy nếu mục tiêu đã lỗi thời, nhưng điều đó dường như không đúng. – mjl5007

+0

Câu trả lời này hoạt động –

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