回覆列表
  • 1 # 使用者8852944140293

    兩個project:

    dym -> dym.framework

    hello -> hello.app

    hello.app動態連結dym.framework

    關於動態連結的xcode設定有以下幾個變數:

    @rpath

    hello專案中,Run Path search paths的值,基本格式如下:

    //:configuration = Debug

    LD_RUNPATH_SEARCH_PATHS = $(inherited) @loader_path/Frameworks @executable_path/Frameworks

    //:configuration = Release

    LD_RUNPATH_SEARCH_PATHS = $(inherited) @loader_path/Frameworks @executable_path/Frameworks

    @loader_path

    根據apple doc的解析,是使用載入共享庫的二進位制檔案所在的目錄

    比如, hello.app/hello會載入dym.framework/dym,則@loader_path指向hello.app目錄

    @executable_path

    根據app包中的可執行檔案所在的目錄;

    dym專案需要設定:

    Dynamic Library Install Name Base: @rpath

    這樣, Dynamic Library install Name, 預設設定

    $(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)

    就會顯示成

    @rpath/dym.framework/dym

    那麼,編譯生成的動態庫檔案中,會儲存對應的install name資訊

    hello專案的設定,只需要設定Run Path search paths即可,

    編譯完成後,會將path引數的資訊儲存到hello的目標檔案的RPATH中,

    程式執行的時候,會在RPATH指定的路徑下,查詢動態庫的install name; 關於rpath在編譯器中是怎麼生成的,可以參考這裡。

    使用dlopen開啟的時候,會根據@rapth指定的路徑,查詢動態庫, 使用以下格式就可以開啟:

    dlopen(“./dym.framework/dym”, RTLD_LAZY);

  • 中秋節和大豐收的關聯?
  • 貓夏丐尊主要內容概括?