Dynamic-Linking
ldconfig 找到庫文件,但 ldd 找不到
我已經建構了 OpenGL 加速庫(libGL 和 libGLU),我將它們保存在一個特定的目錄中,
/usr/lib/mali
. 我還有一個 OpenGL 的軟體實現,它安裝在/usr/lib/arm-linux-gnueabihf
. 這兩個目錄都是先添加的/etc/ld.so.conf
,/usr/lib/mali
因此程序更喜歡其中的庫。
ldconfig
找到所有庫:$ sudo ldconfig -v /usr/lib/mali: libGLU.so.1 -> libGLU.so.1 libGL.so.1.2.0 -> libGL.so.1 /usr/lib/arm-linux-gnueabihf: libGL.so.1 -> libGL.so.1.5.08005 libGLU.so.1 -> libGLU.so.1.3.08005
奇怪的部分是
ldconfig
創建了一個符號連結libGL.so.1.2.0
,但對libGLU
.ldd
輸出更奇怪:ldd `which glxgears` libGLU.so.1 => /usr/lib/mali/libGLU.so.1 (0xb6e4a000) libGL.so.1 => /usr/lib/arm-linux-gnueabihf/libGL.so.1 (0xb6bb5000) libGL.so.1.2.0 => /usr/lib/mali/libGL.so.1.2.0 (0xb67f1000)
輸出表明它
libGLU
取自硬體加速目錄,同時libGL
堅持軟體實現。libGL.so.1.2.0
由於某種原因也被載入。最後,我執行時使用軟體實現glxgears
。誰能解釋我發生了什麼事?我可以做些什麼來讓我的硬體加速庫預設載入,而不刪除或覆蓋軟體庫
/usr/lib/arm-linux-gnueabihf/
(它們實際上是包依賴項)?PS:當我添加
/usr/lib/mali/
到LD_LIBRARY_PATH
.
問題確實出在我的 Makefile 設置中。檢查庫並
objdump
發現根本原因:$ objdump -p libGL.so.1 |grep SONAME SONAME libGL.so.1.2.0
ldd
顯示兩個libGL.so.1
andlibGL.so.1.2.0
,因為第一個是由我導入的glxgears
,第二個是由我的實現導入的,libGLU
它是針對硬體加速版本建構的libGL
,因此知道它的 sonamelibGL.so.1.2.0
,.解決方法是用
-soname,libGL.so.1
.