簡體   English   中英

如何在Mac OS X(C ++)中使用dylib

[英]How to use dylib in Mac OS X (C++)

我制作了一個成功調用了dylib的應用程序(可執行文件),但是dylib文件和可執行文件位於不同的目錄中。 我將包含dylib文件的目錄添加到$ PATH環境變量中,但是仍然無法加載。 我將所有dylib文件復制到可執行文件,程序最終運行。 這確認dylib文件沒有問題。 但是,如何告訴操作系統找到它? 在Windows中,我只需要將包含dll文件的目錄路徑添加到$ PATH。 對於Mac OS X,我需要做什么? 非常感謝!

閱讀Justin提供的鏈接后,我成功地使用了@executable_path令牌將dylib install_name更改為指向可執行文件所在的目錄。

@executable_path絕對路徑很煩人。 有時,您想將框架嵌入到應用程序中,而不必將框架安裝到/ Library或類似位置。

Mac對此的解決方案是@executable_path。 這是一個魔術標記,當放置在庫的安裝名稱的開頭時,該標記將擴展到正在加載它的可執行文件的路徑,減去最后一個組件。 例如,假設Bar.app與Foo.framework鏈接。 如果Bar.app安裝在/ Applications中,則@executable_path將擴展到/Applications/Bar.app/Contents/MacOS。 如果打算將框架嵌入到Contents / Frameworks中,則只需將Foo.framework的安裝名稱設置為@executable_path /../ Frameworks / Foo.framework / Versions / A / Foo。 動態鏈接器會將其擴展到/Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo並在此處找到框架。

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

我將舉一個例子進行演示。

假設我有以下可執行文件/ opt / local / bin / convert ,其dylib在/ opt / local / lib中 我想將其復制到另一個目錄,並使其從與復制可執行文件相同的目錄加載其dylib。

> mkdir ~/tmp/bin
> cp /opt/local/bin/convert ~/tmp/bin

獲取可執行文件dylib的列表

> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
    /opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    /opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
    /opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    /opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
    /opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
    ...

我只關心/ opt / local / lib目錄中的dylib,因此我們只提取/ opt中的 dylib。 我想保留所有其他dylib引用,尤其是/ usr / lib / libSystem的東西。

> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print $1 }'`

將可執行文件引用的所有dylib復制到復制了可執行文件的目錄中。

> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;

使用install_name_tool更改我們在上一步中拉出的所有dylib的安裝名稱,並通過在dylib名稱前添加@executable_path來替換它們。 這將使動態鏈接程序在與可執行文件所在的目錄中查找dylib。

> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;

確認安裝名稱已更改,並且libSystem仍指向/ usr / lib / libSystem

> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
    @executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    @executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
    @executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
    @executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
    @executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
    @executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
    @executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
    @executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
    ...

您需要設置DYLD_LIBRARY_PATH環境變量。

dyld手冊頁中

      This  is  a  colon  separated  list  of directories that contain libraries. The dynamic linker
      searches these directories before it searches the default locations for libraries.  It  allows
      you to test new versions of existing libraries.

      For  each  library  that  a program uses, the dynamic linker looks for it in each directory in
      DYLD_LIBRARY_PATH in turn. If it still can't find the library,  it  then  searches  DYLD_FALL-
      BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn.

如果dylib在庫的INSTALL_NAME指定的位置,它將正常工作*。

否則,您可以將dylib的位置添加到DYLD_LIBRARY_PATH。 您可能需要閱讀dyld文檔

*)完全准確,它必須位於DYLD_ROOT_PATH / INSTALL_NAME,但是很少用DYLD_ROOT_PATH進行混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM