動態庫的搜索路徑


簡單整理一下,備忘;只關注Linux和Windows,其他情況不了解。dbzhang800 20110617

Windows

Windows下動態的庫的搜索順序,MSDN Dynamic-Link Library Search Order 中有詳細的介紹。我們此處只關注比較正統的搜索順序:

  • 包含可執行文件的目錄
  • Windows的系統目錄 (該目錄可通過GetSystemDirectory得到)

  • 16位的系統目錄 (即Windows目錄下的system子目錄)
  • Windows 目錄 (該目錄可通過GetWindowsDirectory得到)

  • 進行的當前工作目錄
  • PATH環境變量中所列出的目錄

注:工作目錄位於Windows目錄之后,這一改變始於 Windows Xp SP2.

Linux

注意:本部分內容不完全,如果你確實對此感興趣,請考慮移步:http://blog.csdn.net/dbzhang800/article/details/6918413

動態庫常規的搜索路徑:

  • 程序構建時通過 RPATH 指定的目錄
  • LD_LIBRARY_PATH 環境變量中冒號分割的目錄
  • 文件 /etc/ld.so.cache列出的庫(使用工具ldconfig維護)

  • 程序構建時 RUNPATH 指定的目錄(fix me)
  • 目錄 /lib

  • 目錄 /usr/lib

注:RPATH似乎是很有爭議的一個東西RpathIssue

ORIGIN

盡管有爭議,我們還是可以想windows下一樣,讓程序從它所在的路徑下加載動態庫。

  • 直接調用編譯器,使用 -Wl,-R,'$ORIGIN'

g++ hello.cpp -lmylib -Wl,-R,'$ORIGIN' -o hello
  • 編寫makefile的話,使用 -Wl,-R,'$$ORIGIN'

all:
g++ hello.cpp -lmylib -Wl,-R,'$$ORIGIN' -o hello
  • 使用qmake的話,我們需要在pro文件內添加
unix:!mac:QMAKE_LFLAGS += -Wl,--rpath=///$/$ORIGIN

-R后跟路徑和--rpath= 是等價的寫法

參考

http://blog.csdn.net/dbzhang800/article/details/6549777


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com