吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【GCC編譯運行報錯】error while loading

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-08-26 13:14 ? 次閱讀

運行編譯后的程序報錯 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

-------------------------------------------------------------------------------------------------------------------

首先說明一下,這個題目有點長,但是卻很好地反應(yīng)了遇到的問題點。

在《如何用C代碼生成二維碼》一文中,小編也向大家展示了在正確無誤地編譯好qrcode_test程序后,運行報錯的問題。這次我們再拿出來說一說。

當時在終端手動./運行程序報錯的提示./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot open shared object file: No such file or directory

大概的意思就是在運行程序的時候,沒有找到程序所需的libzint.so動態(tài)庫。大家都知道,動態(tài)庫與靜態(tài)庫的最大區(qū)別就是:靜態(tài)庫是靜態(tài)鏈接,也就是在生產(chǎn)可執(zhí)行文件的時候就把靜態(tài)庫中的實現(xiàn)嵌入到程序中了,一旦編譯成功了,靜態(tài)庫也就有存在的價值了,即便靜態(tài)庫不存在了,可執(zhí)行程序也是可以跑起來的;但是動態(tài)庫就不一樣了,它是遵循動態(tài)鏈接,也是就說編譯的時候需要指定路徑去找該so文件鏈接編譯,運行的時候也需要指定相應(yīng)的路徑去找。如果在運行的時候,可執(zhí)行程序會先去默認的系統(tǒng)lib目錄下,尋找該so,如果找不到了,就該報錯了:error while loading shared libraries。(可以通過該文章,了解下動態(tài)庫的動態(tài)加載機制http://blog.csdn.net/dbzhang800/article/details/6918413

上面這一段話,講可執(zhí)行程序運行時去找so文件,講得比較籠統(tǒng),以下總結(jié)以下:

動態(tài)庫的搜索路徑搜索的先后順序是:

1.編譯目標代碼時指定的動態(tài)庫搜索路徑;

2.環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;

3.配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑;

4.默認的動態(tài)庫搜索路徑/lib /usr/lib。

可參考下這篇博文,它里面提及了gcc編譯動態(tài)庫和運行鏈接動態(tài)庫的知識。linux-gcc 編譯時頭文件和庫文件搜索路徑 - zhengmeifu - 博客園

回到可執(zhí)行程序運行報error while loading shared libraries錯的問題上來,在《如何用C代碼生成二維碼》一文中,也講到了如何避過這種錯誤而將程序跑起來,我們使用的是上面提及的2.環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;”,即通過設(shè)置LD_LIBRARY_PATH,把當前程序使用的so的路徑添加到LD_LIBRARY_PATH中去,這樣程序跑起來的時候,去LD_LIBRARY_PATH找肯定就可以找到該so了。當然之前我們也已經(jīng)驗證了此方法的正確性。

看,程序運行就沒有問題。

如果僅僅又是重復介紹該方法,那么此文存在的意義就不大了。此文最大的意義在于,告訴讀者,我們可以不用設(shè)置LD_LIBRARY_PAT,也一樣可以把程序跑起來,那么我們該從那里下手呢?本文主要介紹,從編譯該程序開始。

這里就要先介紹下gcc的編譯選項了,但這里不具體細說,有興趣可以通過man gcc去了解,或者從博文的上一篇文章 【轉(zhuǎn)載】gcc 使用中常用的參數(shù)及命令【轉(zhuǎn)載】gcc 使用中常用的參數(shù)及命令 - 架構(gòu)師李肯 - 博客園 去了解。

這里,我們需要用到的編譯選項是-Wl,-rpath;主要這里是字母l,而不是數(shù)字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”兩者在功能是等價的。如下圖所示:

從圖中我們可看到,確實編譯成功后直接運行程序就不會再報error while loading shared libraries了,而且這種方法最大的好處就是,在編譯成功后,不用再去做任何設(shè)置就可以把程序跑起來了,當然是編譯時傳遞的-rpath參數(shù)得是正確的。這個方法,尤其是在交叉編譯嵌入式設(shè)備的可執(zhí)行程序時,十分有用。不妨讀者可以自己試試看。

?審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5092

    文章

    19178

    瀏覽量

    307696
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    24889
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    661

    瀏覽量

    33042
收藏 人收藏

    評論

    相關(guān)推薦

    Linux 下GCC編譯

    一、Linux 下多文件編譯 在上一篇 Linux 下的 C 編程我們知道了 Linux 下的編譯器為 GCC ,以及如何使用 GCC 進行編譯
    的頭像 發(fā)表于 09-11 15:18 ?2726次閱讀
    Linux 下<b class='flag-5'>GCC</b>的<b class='flag-5'>編譯</b>

    Error loading design # Error: Error loading design # Pausing macro ex...

    如圖,quartus11.0 調(diào)用modelsim時候總是出現(xiàn):Error loading design# Error: Error loading
    發(fā)表于 03-14 19:11

    modelsim仿真出錯“Error loading design”

    最近不知為何,我的modelsim_ase在仿真時經(jīng)常出現(xiàn)“Error loading design”的錯誤提示,但是代碼編譯是成功的。而且,每次重裝之后就不會報錯了。求教,這是怎么回
    發(fā)表于 07-29 20:55

    error loading design

    本帖最后由 小工兵 于 2015-8-23 13:57 編輯 最近用modelsim仿真工程時老是遇到報錯error loading design ,而且無其他錯誤信息,設(shè)計的編譯
    發(fā)表于 08-23 13:55

    gcc編譯出錯

    hello.c無法編譯 編譯如下3)fatal error: sys/cdefs.h No such file or directory解決方案 運行sudo apt-get upda
    發(fā)表于 04-01 07:45

    基于CM33核,GCC編譯中嵌入?yún)R編報錯

    原有的工程是MDK下編譯通過。現(xiàn)在使用GCC編譯,代碼中有調(diào)用__set_PRIMASK(0);結(jié)果使用GCC編譯
    發(fā)表于 05-12 10:33

    為什么OKMX6UL-C板子直接執(zhí)行編譯好的qt程序會報錯

    板子型號:OKMX6UL-C直接執(zhí)行編譯好的qt程序報錯,或者打開/opt/qt4.8.5/apps/led 里面的led程序 報錯報錯內(nèi)容:err
    發(fā)表于 01-07 07:25

    淺談gcc編譯

    3.3 gcc編譯器 GNU CC(簡稱為gcc)是GNU項目中符合ANSI C標準的編譯系統(tǒng),能夠編譯用C、C++和Object C等語言
    發(fā)表于 10-18 13:48 ?0次下載

    如何在Keil MDK中使用GCC編譯器工具鏈

    Keil MDK 是否支持編譯器?有沒有辦法選擇其他編譯器? 可能你使用其他GUN工具鏈進行編譯時,會出現(xiàn)類似如下錯誤: --- Error: cant execute as---
    的頭像 發(fā)表于 11-20 15:53 ?4802次閱讀

    "移植STM32F051,編譯后遇到 #error ""Please select first the target STM32F0xx device used in your applicatio"

    報錯如下編譯報錯如下解決辦法編譯報錯如下.\Libraries\CMSIS\Device\ST\STM32F0xx\Include\stm3
    發(fā)表于 12-02 17:21 ?9次下載
    "移植STM32F051,<b class='flag-5'>編譯</b>后遇到    #<b class='flag-5'>error</b> ""Please select first the target STM32F0xx device used in your applicatio"

    "STM32-MDK: Error: L6915E: Library reports error: __use_no_semihosting was requested,"

    編譯程序是報錯:…\OBJ\test_program.axf: Error: L6915E: Library reports error: __use_no_semihosting
    發(fā)表于 12-03 09:51 ?9次下載
    "STM32-MDK: <b class='flag-5'>Error</b>: L6915E: Library reports <b class='flag-5'>error</b>: __use_no_semihosting was requested,"

    IAR 報錯報錯Error[Pe020]: identifier “XXX“ is undefined

    報錯Error[Pe020]: identifier “s” is undefined看上圖,s肯定是已經(jīng)定義了,為什么還會有這種報錯。請小伙伴注意,如果這是c文件中聲明的第一個函數(shù),那么肯定是頭文件出問題了。我這邊回頭查看頭
    發(fā)表于 12-03 11:06 ?6次下載
    IAR <b class='flag-5'>報錯</b><b class='flag-5'>報錯</b>:<b class='flag-5'>Error</b>[Pe020]: identifier “XXX“ is undefined

    stm32 cubemx 添加 rt-thread 操作系統(tǒng) context_gcc.S 編譯報錯

    stm32 cubemx 添加 rt-thread 操作系統(tǒng) context_gcc.S 編譯報錯解決方法(eclipse+CDT 或 cubeide)解決方法(eclipse+CDT 或
    發(fā)表于 12-27 18:47 ?7次下載
    stm32 cubemx 添加 rt-thread 操作系統(tǒng) context_<b class='flag-5'>gcc</b>.S <b class='flag-5'>編譯</b><b class='flag-5'>報錯</b>

    如何從GCC源碼學編譯原理

    本文結(jié)合編譯原理理論和GCC實踐做了一個總結(jié),希望能給需要了解編譯原理和底層知識的同學一個更快的學習路徑。
    的頭像 發(fā)表于 03-02 16:15 ?3345次閱讀
    如何從<b class='flag-5'>GCC</b>源碼學<b class='flag-5'>編譯</b>原理

    Linux使用gcc編譯程序的語法

    01. 調(diào)試相關(guān)的宏 在Linux使用gcc編譯程序的時候,對于調(diào)試的語句還具有一些特殊的語法。 gcc編譯的過程中,會生成一些宏,可以使用這些宏分別打印當前源文件的信息,主要內(nèi)容是當
    的頭像 發(fā)表于 06-22 10:51 ?758次閱讀
    中西区| 网络百家乐的破解| 幸运水果机小游戏| 百家乐官网上海代理| 百家乐娱乐网真钱游戏| 百家乐官网视频交流| 金沙百家乐娱乐城场| 易博全讯网| 百家乐游戏规测| 卡卡湾网上娱乐| 百家乐视频大厅| 澳门葡京赌场图片| 爱赢百家乐现金网| 在线扎金花| 澳门百家乐大小| 财神百家乐官网娱乐城| BB百家乐大转轮| 代理百家乐官网最多占成| 单机百家乐游戏下| 百家乐官网娱乐网77scs| 大发888娱乐城范本| 网上百家乐官网赌博出| 德州扑克大赛视频| 新澳门百家乐官网软件下载| 申博太阳城官方网站| 百家乐官网分析绿色版| 天博百家乐的玩法技巧和规则| 百家乐官网那个平台信誉高| 大发888手机下载| 太阳百家乐官网代理| 临城县| 有钱人百家乐的玩法技巧和规则 | 富平县| 如何赢百家乐的玩法技巧和规则| 澳门百家乐官网玩法与游戏规则 | 百家乐tt娱乐平台| 太阳城百家乐官网网址--| 辽宁棋牌游戏大厅| e世博百家乐娱乐场| 网上百家乐官网平台下载| 大发888真人网址|