動態庫連接注意事項

    編譯連接動態庫時須要注意幾個點:spa

    1)連接階段要指定動態庫的路徑,與運行時要查找的動態庫的路徑是兩個概念。編譯

    2)連接階段,若是是經過-l選項指定動態庫時,須要搭配-L選項指定連接路徑。這要求動態庫使用lib前綴。test

      若是依賴的動態庫沒有lib前綴,能夠考慮指定動態庫的路徑,以依賴文件的方式連接。gcc

      好比編譯動態庫c.so,當前路徑爲c.so的編譯路徑,依賴於../../test/a.so:file

        gcc -shared -fPIC -o c.so c1.c c2.c ../../test/a.so -lrt -ldl -Wl, rpath=./:../testgc

    3)運行時階段,指定要動態裝載的動態庫的路徑,則是經過-Wl,rpath選項來指定。若是是多個路徑,則以冒號分隔。好比上述命令指定了當前路徑和test路徑。makefile

    4)注意,rpath所指定的路徑,是以可執行文件所在的位置爲參照的。而連接指定的路徑,是以執行makefile所在的位置爲參照的。若是連接指定的路徑是錯誤的,在編譯連接階段就會報找不到依賴文件的錯誤。而若是rpath指定的路徑中沒有依賴的動態庫,那麼在運行時會報找不到依賴文件的錯誤。能夠在編譯連接結束後,經過ldd命令查看相關文件的動態庫依賴,若是rpath指定的路徑中找不到依賴的話,那麼在ldd的輸出中,依賴項會顯示not found。除了ldd外,objdump、nm、readelf等都是分析依賴符號的有效手段。文件

相關文章
相關標籤/搜索