99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

【GCC編譯運(yùn)行報(bào)錯(cuò)】error while loading

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-08-26 13:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

運(yùn)行編譯后的程序報(bào)錯(cuò) error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

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

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

在《如何用C代碼生成二維碼》一文中,小編也向大家展示了在正確無誤地編譯好qrcode_test程序后,運(yùn)行報(bào)錯(cuò)的問題。這次我們?cè)倌贸鰜碚f一說。

當(dāng)時(shí)在終端手動(dòng)./運(yùn)行程序報(bào)錯(cuò)的提示./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot open shared object file: No such file or directory

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

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

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

1.編譯目標(biāo)代碼時(shí)指定的動(dòng)態(tài)庫搜索路徑;

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

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

4.默認(rèn)的動(dòng)態(tài)庫搜索路徑/lib /usr/lib。

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

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

看,程序運(yùn)行就沒有問題。

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

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

這里,我們需要用到的編譯選項(xiàng)是-Wl,-rpath;主要這里是字母l,而不是數(shù)字1。-rpath選項(xiàng)就是告訴gcc在編譯鏈接的時(shí)候,把該程序的運(yùn)行是查找so的路徑寫入到ELF文件中。使用方法就是 gcc –o OutApp *.c –lzint –Wl,-rpath=”/usr/local/lib”或gcc –o OutApp *.c –lzint –Wl,-rpath –Wl,“/usr/local/lib”兩者在功能是等價(jià)的。如下圖所示:

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

?審核編輯:湯梓紅

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

    關(guān)注

    5152

    文章

    19678

    瀏覽量

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

    關(guān)注

    0

    文章

    111

    瀏覽量

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

    關(guān)注

    0

    文章

    679

    瀏覽量

    34035
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux 下GCC編譯

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

    ubuntu24.04上安裝gcc工具鏈出現(xiàn)報(bào)錯(cuò)怎么解決?

    虛擬機(jī)安裝的ubuntu24.04.1,默認(rèn)gcc版本13,從芯來官網(wǎng)下載了對(duì)應(yīng)的gcc版本的工具鏈,到最后編譯報(bào)錯(cuò): riscv64-unknown-linux-gnu-
    發(fā)表于 03-07 12:39

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

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

    modelsim仿真出錯(cuò)“Error loading design”

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

    error loading design

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

    gcc編譯出錯(cuò)

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

    基于CM33核,GCC編譯中嵌入?yún)R編報(bào)錯(cuò)

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

    為什么OKMX6UL-C板子直接執(zhí)行編譯好的qt程序會(huì)報(bào)錯(cuò)

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

    淺談gcc編譯

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

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

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

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

    報(bào)錯(cuò)如下編譯報(bào)錯(cuò)如下解決辦法編譯報(bào)錯(cuò)如下.\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,"

    編譯程序是報(bào)錯(cuò):…\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 報(bào)錯(cuò)報(bào)錯(cuò)Error[Pe020]: identifier “XXX“ is undefined

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

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

    stm32 cubemx 添加 rt-thread 操作系統(tǒng) context_gcc.S 編譯報(bào)錯(cuò)解決方法(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ào)錯(cuò)</b>

    Linux使用gcc編譯程序的語法

    01. 調(diào)試相關(guān)的宏 在Linux使用gcc編譯程序的時(shí)候,對(duì)于調(diào)試的語句還具有一些特殊的語法。 gcc編譯的過程中,會(huì)生成一些宏,可以使用這些宏分別打印當(dāng)前源文件的信息,主要內(nèi)容是當(dāng)
    的頭像 發(fā)表于 06-22 10:51 ?1077次閱讀