2017-03-11 80 views
1

我寫了一個使用libusb的C程序。現在我想分發這個程序到「普通」(非開發)Mac OS X電腦。但是,當我移植了編譯的文件到測試機器,我得到了以下錯誤:在動態C庫(dylib)中編譯爲OS X上的程序

dyld: Library not loaded: /opt/local/lib/libusb-0.1.4.dylib 
    Referenced from: /Users/kitty/myprogram 
    Reason: image not found 
Trace/BPT trap: 5 

當我複製文件(所有文件僅適用)

/opt/local/lib/libusb-0.1.4.dylib /opt/local/lib/libusb-1.0.a  
/opt/local/lib/libusb.a 
/opt/local/lib/libusb-1.0.0.dylib /opt/local/lib/libusb-1.0.dylib  
/opt/local/lib/libusb.dylib 

從我的機器到目標機器程序工作完美無瑕。

但我真的想創建或編譯成一個單一的可執行文件。這怎麼可能?

使用-static雖然編譯不起作用,因爲並非所有的庫都可以靜態編譯到最終的應用程序中(請參見this SO question here)。

那麼我該如何製作一個整潔的小應用程序文件?

回答

1

您可以convert a static library to a dynamic library,但我不知道有一種方法可以根據需要進行相反操作。

如果您正在構建一個捆綁應用程序,則需要將要分發的庫放入捆綁軟件包中,位於Frameworks目錄中,然後進行鏈接。

如果構建基於捆的應用程序,只是一個單一的二進制文件,你可能需要對如何將他們的系統上安裝庫中的用戶(例如,通過自制)的說明。

這裏是你如何對基於包,應用程序做到這一點:

蘋果有document about run-path dependent libraries但實際上並沒有解釋如何設置這一個新手。

下面是它如何工作:

  • 添加您要使用到項目的libusb.dylib
  • 它應該自動添加到您的「Link Binary with Libraries」階段在您的項目中「Build Phases」。如果沒有,請在此處添加。
  • 添加新的「複製文件」構建階段。
    • 「目的地」下拉框,選擇「框架」。這是應用最終捆綁包中的 Frameworks目錄。
    • 然後在該複製構建階段按「+」圖標並添加您的庫。
  • 如果您有任何手動鏈接選項,如-L/usr/local/lib-lusb,請將其刪除。
  • 清潔和構建。

當您查看應用程序包時,您會看到該庫已複製到<bundle_path>/Contents/Frameworks/。您現在可以從任何地方啓動應用程序,動態鏈接加載程序知道它需要查看<path_to_binary>/../Frameworks/來查找您的庫。

但是:你可能需要重建libusbinstall_name設置爲@rpath/../Frameworks/libusb.dylib或使用install_name_tool CLI工具解決您的libusb.dylib副本,您添加到您的項目路徑。