運行編譯后的程序報錯 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory
-------------------------------------------------------------------------------------------------------------------
首先說明一下,這個題目有點長,但是卻很好地反應了遇到的問題點。
在《如何用C代碼生成二維碼》一文中,小編也向大家展示了在正確無誤地編譯好qrcode_test程序后,運行報錯的問題。這次我們再拿出來說一說。
當時在終端手動./運行程序報錯的提示./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot open shared object file: No such file or directory
![](https://file.elecfans.com//web2/M00/64/B2/poYBAGMIVpuAP42VAADEgNPcSSM641.png)
大概的意思就是在運行程序的時候,沒有找到程序所需的libzint.so動態庫。大家都知道,動態庫與靜態庫的最大區別就是:靜態庫是靜態鏈接,也就是在生產可執行文件的時候就把靜態庫中的實現嵌入到程序中了,一旦編譯成功了,靜態庫也就有存在的價值了,即便靜態庫不存在了,可執行程序也是可以跑起來的;但是動態庫就不一樣了,它是遵循動態鏈接,也是就說編譯的時候需要指定路徑去找該so文件鏈接編譯,運行的時候也需要指定相應的路徑去找。如果在運行的時候,可執行程序會先去默認的系統lib目錄下,尋找該so,如果找不到了,就該報錯了:error while loading shared libraries。(可以通過該文章,了解下動態庫的動態加載機制http://blog.csdn.net/dbzhang800/article/details/6918413)
上面這一段話,講可執行程序運行時去找so文件,講得比較籠統,以下總結以下:
動態庫的搜索路徑搜索的先后順序是:
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib /usr/lib。
可參考下這篇博文,它里面提及了gcc編譯動態庫和運行鏈接動態庫的知識。linux-gcc 編譯時頭文件和庫文件搜索路徑 - zhengmeifu - 博客園
回到可執行程序運行報error while loading shared libraries錯的問題上來,在《如何用C代碼生成二維碼》一文中,也講到了如何避過這種錯誤而將程序跑起來,我們使用的是上面提及的“2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;”,即通過設置LD_LIBRARY_PATH,把當前程序使用的so的路徑添加到LD_LIBRARY_PATH中去,這樣程序跑起來的時候,去LD_LIBRARY_PATH找肯定就可以找到該so了。當然之前我們也已經驗證了此方法的正確性。
![](https://file.elecfans.com//web2/M00/65/4C/pYYBAGMIVpuAP7ybAAEvERnMDHE020.png)
看,程序運行就沒有問題。
如果僅僅又是重復介紹該方法,那么此文存在的意義就不大了。此文最大的意義在于,告訴讀者,我們可以不用設置LD_LIBRARY_PAT,也一樣可以把程序跑起來,那么我們該從那里下手呢?本文主要介紹,從編譯該程序開始。
這里就要先介紹下gcc的編譯選項了,但這里不具體細說,有興趣可以通過man gcc去了解,或者從博文的上一篇文章 【轉載】gcc 使用中常用的參數及命令【轉載】gcc 使用中常用的參數及命令 - 架構師李肯 - 博客園 去了解。
這里,我們需要用到的編譯選項是-Wl,-rpath;主要這里是字母l,而不是數字1。-rpath選項就是告訴gcc在編譯鏈接的時候,把該程序的運行是查找so的路徑寫入到ELF文件中。使用方法就是 gcc –o OutApp *.c –lzint –Wl,-rpath=”/usr/local/lib”或gcc –o OutApp *.c –lzint –Wl,-rpath –Wl,“/usr/local/lib”兩者在功能是等價的。如下圖所示:
![](https://file.elecfans.com//web2/M00/64/B2/poYBAGMIVpuAJGqmAAFXgVkxLAI740.png)
從圖中我們可看到,確實編譯成功后直接運行程序就不會再報error while loading shared libraries了,而且這種方法最大的好處就是,在編譯成功后,不用再去做任何設置就可以把程序跑起來了,當然是編譯時傳遞的-rpath參數得是正確的。這個方法,尤其是在交叉編譯嵌入式設備的可執行程序時,十分有用。不妨讀者可以自己試試看。
?審核編輯:湯梓紅
-
嵌入式
+關注
關注
5096文章
19189瀏覽量
308031 -
GCC
+關注
關注
0文章
108瀏覽量
24909 -
編譯
+關注
關注
0文章
662瀏覽量
33072
發布評論請先 登錄
相關推薦
Error loading design # Error: Error loading design # Pausing macro ex...
modelsim仿真出錯“Error loading design”
error loading design
gcc編譯出錯
為什么OKMX6UL-C板子直接執行編譯好的qt程序會報錯
淺談gcc編譯器
如何在Keil MDK中使用GCC編譯器工具鏈
"移植STM32F051,編譯后遇到 #error ""Please select first the target STM32F0xx device used in your applicatio"
!["移植STM32F051,<b class='flag-5'>編譯</b>后遇到 #<b class='flag-5'>error</b> ""Please select first the target STM32F0xx device used in your applicatio"](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
"STM32-MDK: Error: L6915E: Library reports error: __use_no_semihosting was requested,"
!["STM32-MDK: <b class='flag-5'>Error</b>: L6915E: Library reports <b class='flag-5'>error</b>: __use_no_semihosting was requested,"](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
IAR 報錯報錯:Error[Pe020]: identifier “XXX“ is undefined
![IAR <b class='flag-5'>報錯</b><b class='flag-5'>報錯</b>:<b class='flag-5'>Error</b>[Pe020]: identifier “XXX“ is undefined](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32 cubemx 添加 rt-thread 操作系統 context_gcc.S 編譯報錯
![stm32 cubemx 添加 rt-thread 操作系統 context_<b class='flag-5'>gcc</b>.S <b class='flag-5'>編譯</b><b class='flag-5'>報錯</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論