国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux 動(dòng)態(tài)庫(kù)跨庫(kù)調(diào)用 symbol lookup error原因詳解

這篇具有很好參考價(jià)值的文章主要介紹了Linux 動(dòng)態(tài)庫(kù)跨庫(kù)調(diào)用 symbol lookup error原因詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、起因

今天調(diào)試了一個(gè)程序,發(fā)現(xiàn)symbol lookup error,本想網(wǎng)上找一下方法解決算了怎料找了半天都沒(méi)寫(xiě)根因的文章,好不容易找到一篇類(lèi)似的,竟然要收費(fèi)!

自此打算分析一下,symbol lookup error無(wú)非就是鏈接和庫(kù)的查找問(wèn)題。

先說(shuō)我的應(yīng)用場(chǎng)景(簡(jiǎn)化):

主程序(main)調(diào)用A(libefg.so)庫(kù),A庫(kù)調(diào)用B庫(kù)(libabc.so),main沒(méi)有直接調(diào)用B庫(kù)。

運(yùn)行main程序的時(shí)候盡然報(bào)symbol lookup error!明明我的libabc.so也在同級(jí)目錄。

./main: symbol lookup error: ./libefg.so: undefined symbol: _Z9print_abcv

2、分析

2.1 代碼結(jié)構(gòu)

編寫(xiě)B(tài)庫(kù)libabc.so,包含test_abc.cpp和test_abc.h

2.1.1 libabc.so

// test_abc.cpp
#include "test_abc.h"
void print_abc()
{
        printf("abc\n");
}
// test_abc.h
#ifndef __TEST_ABC__
#define __TEST_ABC__ 1
#include <stdlib.h>
#include <stdio.h>
void print_abc();
#endif /* ifndef __TEST_ABC__ */

2.1.2 libefg.so

// test_efg.cpp
#include "test_efg.h"
void print_def()
{
        printf("output def\n");
        print_abc();
}
// test_efg.h
#ifndef __TEST_EFG__
#define __TEST_EFG__ 1
#include "test_abc.h"
void print_def();
#endif /* ifndef __TEST_EFG__ */

2.1.3 main

// main.cpp
#include "test_efg.h"
int main(int argc, char *argv[])
{
        printf("main...\n");
        print_def();
        return 0;
}

2.2 代碼編譯

cat Makefile
all:
        g++ test_abc.cpp -shared -fPIC -o libabc.so
        g++ test_efg.cpp -shared -fPIC -o libefg.so
        g++ main.cpp -L. -Wl,-rpath=./ -lefg -o main -labc

.PHONY: clean

clean:
        rm -rf libabc.so libefg.so main

編譯完成后運(yùn)行報(bào)錯(cuò)

main...
output def
./main: symbol lookup error: ./libefg.so: undefined symbol: _Z9print_abcv

納悶了,明明libabc.so 和libefg.so都在本目錄,不可能找得到libefg找不到libabc。

使用ldd查看二進(jìn)制文件main,看看是不是找不到libabc

ldd ./main
        linux-vdso.so.1 (0x00007ffd069b1000)
        libefg.so => ./libefg.so (0x00007f0c19bc7000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0c195b7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0c199a8000)

原來(lái)不只是找不到,而是壓根沒(méi)有l(wèi)ibabc.so,可以看到libefg.so是可以認(rèn)到的了,難怪沒(méi)有abc的符號(hào),再次確認(rèn)了一下-labc也是已經(jīng)加入了。

這次嘗試去掉-labc看看能否編譯通過(guò)

g++ main.cpp -L. -Wl,-rpath=./ -lefg -o main

竟然毫無(wú)壓力的通過(guò)了。所以abc的符號(hào)在libefg上。

我們?cè)倩仡^看看libefg的編譯參數(shù)

g++ test_efg.cpp -shared -fPIC -o libefg.so

這也沒(méi)提醒我們鏈接libabc啊,因此嘗試讓libefg加上libabc的依賴(lài)

g++ test_efg.cpp -shared -fPIC -o libefg.so -Wl,-rpath=./ -L. -labc

再次整編譯,運(yùn)行正常!

2.3 CMake

以下寫(xiě)法是可以生成庫(kù)和執(zhí)行文件,但是運(yùn)行還是出錯(cuò)。

cmake_minimum_required(VERSION 2.8)

set(name cmain)
project(name)

link_directories(${CMAKE_CURRENT_SOURCE_DIR})

## add libabc
add_library(abc SHARED test_abc.cpp)

## add libefg
add_library(efg SHARED test_efg.cpp)

## add main
add_executable(${name} main.cpp)
target_link_libraries(${name} efg abc)

改為以下的寫(xiě)法,libefg增加libabc的支持后正常

cmake_minimum_required(VERSION 2.8)

set(name cmain)
project(name)

link_directories(${CMAKE_CURRENT_SOURCE_DIR})

## add libabc
add_library(abc SHARED test_abc.cpp)

## add libefg
add_library(efg SHARED test_efg.cpp)
target_link_libraries(efg abc)

## add main
add_executable(${name} main.cpp)
target_link_libraries(${name} efg abc)

3. 結(jié)論

通過(guò)上述可以看到,中間的so(libefg)被main引用,main并不直接引用libabc的,所以中間編譯的so也要加入相應(yīng)的依賴(lài),即使它能正常編譯通過(guò),實(shí)際是它找不到libabc的符號(hào)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-686363.html

到了這里,關(guān)于Linux 動(dòng)態(tài)庫(kù)跨庫(kù)調(diào)用 symbol lookup error原因詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • flutter release 報(bào)錯(cuò) Error: SocketException: Failed host lookup:

    flutter release 報(bào)錯(cuò) Error: SocketException: Failed host lookup:

    flutter 的 debug 模式?jīng)]有任何問(wèn)題 ,打了release 包后一直報(bào)下面的錯(cuò),查了一下是 因?yàn)闆](méi)有網(wǎng)絡(luò)權(quán)限 Error: SocketException: Failed host lookup: \\\'yomi-test-aws-sg.yomigame.games\\\' (OS Error: No address associated with hostname, errno = 7) 按照下面的來(lái)解決 Flutter 網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò) Failed host lookup: 一、如果是iOS真機(jī)

    2024年04月27日
    瀏覽(21)
  • netcore工程在linux下調(diào)用linux動(dòng)態(tài)庫(kù)

    netcore工程在linux下調(diào)用linux動(dòng)態(tài)庫(kù)

    文章的內(nèi)容可能看著枯燥,排版也存在一些問(wèn)題,但是如果你遇到相關(guān)問(wèn)題,真的無(wú)法解決的時(shí)候,不妨沉下心來(lái)好好閱讀一下這篇文章,你會(huì)有所收獲,也可以先跳到文章最后,看看是不是對(duì)你的問(wèn)題有價(jià)值。。 使用P/invoke方式 如果出現(xiàn)調(diào)用失敗的情況,可能是so文件缺少

    2023年04月26日
    瀏覽(17)
  • 【問(wèn)題解決】 Extrapolation Error: Lookup would require extrapolation -0.044000000s into the future

    【問(wèn)題解決】 Extrapolation Error: Lookup would require extrapolation -0.044000000s into the future

    有時(shí)候當(dāng)配置完move_base各個(gè)文件,準(zhǔn)備開(kāi)啟move_base節(jié)點(diǎn)愉快的進(jìn)行導(dǎo)航時(shí),打開(kāi)Rviz,使用2D Nav?Goal工具發(fā)布了一個(gè)目標(biāo)點(diǎn),會(huì)出現(xiàn)全局規(guī)劃路徑,但機(jī)器人不動(dòng),開(kāi)啟move_base節(jié)點(diǎn)的終端出現(xiàn)以下錯(cuò)誤: [ERROR] [1669281693.716503087, 871.669000000]: Extrapolation Error: Lookup would require extra

    2024年02月02日
    瀏覽(17)
  • MASM32連接程序時(shí)error A2006: undefined symbol : u

    MASM32連接程序時(shí)error A2006: undefined symbol : u

    為了檢測(cè)Windows操作系統(tǒng)是32位還是64位的,用MASM32編寫(xiě)了一個(gè)調(diào)用Windows API函數(shù)GetNativeSystemInfo的程序(完整代碼附后),GetNativeSystemInfo函數(shù)會(huì)將指向SYSTEM_INFO結(jié)構(gòu)體的地址存到GetNativeSystemInfo傳遞的參數(shù)中。 微軟官網(wǎng)中的STEM_INFO定義為: SYSTEM_INFO中的wProcessorArchitecture存儲(chǔ)了已

    2024年02月07日
    瀏覽(12)
  • Android Studio里的C/C++返回: ld: error: undefined symbol

    Android Studio里的C/C++進(jìn)行編譯時(shí)返回: ld: error: undefined symbol 的錯(cuò)誤,進(jìn)行了解決。 編譯環(huán)境突然出現(xiàn)了這個(gè)問(wèn)題,嘗試解決,終于找到一個(gè)解決辦法:卸載 ndkVersion = \\\"23.1.7779620\\\" ,再進(jìn)行重新安裝 。 I removed both NDK versions from Android Studio - Tools - SDK Manager - SDK Tools, reinstalled them

    2024年02月03日
    瀏覽(21)
  • Linux 下編譯實(shí)現(xiàn)C/Fortran調(diào)用動(dòng)態(tài)庫(kù)

    Linux 下編譯實(shí)現(xiàn)C/Fortran調(diào)用動(dòng)態(tài)庫(kù)

    目錄 Fortran語(yǔ)言 格式 Windows Linux下動(dòng)態(tài)庫(kù)介紹 windows下obj, lib, dll, exe的關(guān)系 linux .o, .a, .so 生成動(dòng)態(tài)庫(kù)Demo 查看動(dòng)態(tài)庫(kù)中的函數(shù) FORTRAN語(yǔ)言是Formula Translation的縮寫(xiě),意為“公式翻譯”。它是為科學(xué)、工程問(wèn)題或企事業(yè)管理中的那些能夠用數(shù)學(xué)公式表達(dá)的問(wèn)題而設(shè)計(jì)的,其數(shù)值計(jì)算

    2024年02月04日
    瀏覽(16)
  • Flutter 網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò) Failed host lookup: ‘ 地址‘ (OS Error: No address associated with hostname, errno =

    設(shè)備無(wú)網(wǎng)絡(luò) 檢查設(shè)備有網(wǎng)絡(luò) 沒(méi)有配置網(wǎng)絡(luò)權(quán)限 在android/src/main/AndroidManifest.xml中 manifest 標(biāo)簽中配置一下權(quán)限: 注意:不要填寫(xiě)到 application 標(biāo)簽中

    2024年02月02日
    瀏覽(27)
  • ubuntu: acpi bios error (bug) could not resolve symbol解決

    ubuntu: acpi bios error (bug) could not resolve symbol解決

    聯(lián)想拯救者R9000P ubuntu20.04 + windows11 ubuntu內(nèi)核版本:5.15.0.97 開(kāi)機(jī)時(shí)報(bào)錯(cuò),然后瘋狂重啟: ` 鏈接: link ACPI(高級(jí)配置和電源接口)是一種電源管理技術(shù),用于控制計(jì)算機(jī)的硬件設(shè)備和節(jié)能。ACPI+BIOS錯(cuò)誤是指在計(jì)算機(jī)的BIOS配置中存在一些問(wèn)題,導(dǎo)致ACPI無(wú)法正常工作。 個(gè)人猜測(cè)(

    2024年04月23日
    瀏覽(19)
  • 【c++ debug】core dump調(diào)用棧不顯示行號(hào) & no debugging symbols found

    1. 問(wèn)題 問(wèn)題1 gdb ./project顯示沒(méi)有debug符號(hào) Reading symbols from project_name (no debugging symbols found) …done 問(wèn)題2 core dump調(diào)用棧不顯示行號(hào) … #1 0x00007ffff70ac795 in feature() const at /xxx/.so_path/xxx/project.so 2. 原因 編譯沒(méi)有加 -g 選項(xiàng)。-g用于gdb調(diào)試 3. 解決方法 CMakeLists.txt加編譯選項(xiàng) -g 4. 修改后

    2023年04月09日
    瀏覽(16)
  • Linux 內(nèi)核函數(shù)kallsyms_lookup_name

    內(nèi)核模塊開(kāi)發(fā)的基本規(guī)則之一是,模塊只能訪問(wèn)已顯式導(dǎo)出的符號(hào)(函數(shù)和數(shù)據(jù)結(jié)構(gòu)),內(nèi)核使用EXPORT_SYMBOL宏和EXPORT_SYMBOL_GPL宏來(lái)導(dǎo)出符號(hào)。 關(guān)于EXPORT_SYMBOL宏和EXPORT_SYMBOL_GPL宏請(qǐng)參考:Linux EXPORT_SYMBOL宏詳解 即便如此,許多符號(hào)也受到限制,因此只有具有GPL兼容許可證的模塊

    2024年02月11日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包