Problem
這篇文章的緣由是我在嘗試使用ns3帶的NetAnim程序時(shí),顯示了下面這個(gè)錯(cuò)誤:
dyld: Library not loaded: @rpath/QtGui.framework/Versions/4/QtGui
Referenced from: /path/to/ns-allinone-3.28/netanim-3.108/./NetAnim
Reason: image not found
[1] 86663 abort ./NetAnim
這是一個(gè)動(dòng)態(tài)鏈接的錯(cuò)誤,所以沒法通過編譯的時(shí)候添加LDFLAGS
來解決切心。不過錯(cuò)誤里面的@rpath
這個(gè)東西倒是挺有意思灼捂,顯然并不是環(huán)境變量。我在網(wǎng)上查了很多咏雌,但是大多數(shù)是圍繞xcode討論的凡怎,不太適用于我面臨的場景(命令行)校焦。不過這些文章(如這篇)能夠大致闡明@rpath
的用途。簡而言之统倒,@rpath
是一個(gè)類似Shell中的PATH
的變量寨典,程序在執(zhí)行時(shí)會(huì)從@rpath
指定的路徑中尋找動(dòng)態(tài)鏈接庫文件。那么剩下的問題就是我們?nèi)绾尾僮鬟@個(gè)變量了房匆。
Solution
通過otool
我們可以查看一個(gè)程序的動(dòng)態(tài)鏈接文件搜索地址耸成,例如我要用的NetAnim
:
$ otool -L ./NetAnim
./NetAnim:
@rpath/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)
@rpath/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
而我們可以通過install_name_tool
來對這些地址進(jìn)行操作。
$ install_name_tool -h
Usage: /Library/Developer/CommandLineTools/usr/bin/install_name_tool [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input
對我而言浴鸿,我需要將Qt4的動(dòng)態(tài)鏈接庫添加到NetAdmin
的搜索路徑中去井氢,可以使用如下的命令:
install_name_tool -add_rpath /usr/local/Cellar/qt@4/4.8.7_3/lib ./NetAnim
大功告成。