日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

undefined symbol 问题解决记录

發(fā)布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 undefined symbol 问题解决记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歷經(jīng)一個月,昨日完成打印機network部分的編寫(c語言),編寫makefile構(gòu)建動態(tài)庫。構(gòu)建完成后遂進行調(diào)用測試,出現(xiàn):

./network: symbol lookup error: /usr/lib64/netPrnctl.so: undefined symbol: cupsGetDests

將解決方法與過程記錄,以便日后查閱。

查找與分析原因

在編譯時未出現(xiàn)問題,沒有報錯,成功編譯生成動態(tài)庫。以下為編譯的makefile文件。

########################################################### # File: netPrnctl.so Makefile # Author: Neko ###########################################################CC = gcc CFLAGS = -Wall -g -fPICINCLUDE = -I./inc -I../ -I../cups -I../backend -I/usr/include/libusb-1.0 TARGET = netPrnctl.sovpath % .h ./incOBJS = public.o prnctlAvision.o prnctlNetwork.o prnctl.o SRCS = ./src/public.c ./src/prnctlAvision.c ./src/prnctlNetwork.c ./src/prnctl.c$(OBJS):$(SRCS)$(CC) $(CFLAGS) $(INCLUDE) -c $^all:$(OBJS)$(CC) -shared -fPIC -o $(TARGET) $(OBJS) -pthreadcp $(TARGET) /usr/bincp $(TARGET) /usr/lib64clean:rm -f *.orm -f netPrnctl.so

雖成功生成了動態(tài)庫,但是在調(diào)用時卻出現(xiàn)找不到符號的問題,于是使用 ldd -r 查看

neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ ldd -r /usr/lib64/netPrnctl.solinux-vdso.so.1 (0x00007ffeef44c000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9607add000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f96076ec000)/lib64/ld-linux-x86-64.so.2 (0x00007f9607f0f000) undefined symbol: libusb_open (/usr/lib64/netPrnctl.so) undefined symbol: cupsArrayNew (/usr/lib64/netPrnctl.so) undefined symbol: cupsDirOpen (/usr/lib64/netPrnctl.so) undefined symbol: ppdFindAttr (/usr/lib64/netPrnctl.so) undefined symbol: cupsParseOptions (/usr/lib64/netPrnctl.so) undefined symbol: cupsGetPPD (/usr/lib64/netPrnctl.so) undefined symbol: libusb_set_interface_alt_setting (/usr/lib64/netPrnctl.so) undefined symbol: libusb_release_interface (/usr/lib64/netPrnctl.so) undefined symbol: ppdClose (/usr/lib64/netPrnctl.so) undefined symbol: cupsGetOption (/usr/lib64/netPrnctl.so) undefined symbol: libusb_detach_kernel_driver (/usr/lib64/netPrnctl.so) undefined symbol: libusb_close (/usr/lib64/netPrnctl.so) undefined symbol: cupsFreeOptions (/usr/lib64/netPrnctl.so) undefined symbol: cupsDirClose (/usr/lib64/netPrnctl.so) undefined symbol: libusb_get_string_descriptor_ascii (/usr/lib64/netPrnctl.so) undefined symbol: libusb_free_config_descriptor (/usr/lib64/netPrnctl.so) undefined symbol: libusb_get_config_descriptor (/usr/lib64/netPrnctl.so) undefined symbol: cupsBackChannelWrite (/usr/lib64/netPrnctl.so) undefined symbol: _cupsGet1284Values (/usr/lib64/netPrnctl.so) undefined symbol: _ppdNormalizeMakeAndModel (/usr/lib64/netPrnctl.so) undefined symbol: libusb_attach_kernel_driver (/usr/lib64/netPrnctl.so) undefined symbol: libusb_get_device_list (/usr/lib64/netPrnctl.so) undefined symbol: libusb_kernel_driver_active (/usr/lib64/netPrnctl.so) undefined symbol: _cups_strcasecmp (/usr/lib64/netPrnctl.so) undefined symbol: libusb_bulk_transfer (/usr/lib64/netPrnctl.so) undefined symbol: _cupsLangPrintFilter (/usr/lib64/netPrnctl.so) undefined symbol: cupsSideChannelRead (/usr/lib64/netPrnctl.so) undefined symbol: cupsArrayCount (/usr/lib64/netPrnctl.so) undefined symbol: cupsFileClose (/usr/lib64/netPrnctl.so) undefined symbol: cupsDirRead (/usr/lib64/netPrnctl.so) undefined symbol: libusb_set_configuration (/usr/lib64/netPrnctl.so) undefined symbol: cupsFreeDests (/usr/lib64/netPrnctl.so) undefined symbol: libusb_open_device_with_vid_pid (/usr/lib64/netPrnctl.so) undefined symbol: libusb_reset_device (/usr/lib64/netPrnctl.so) undefined symbol: libusb_exit (/usr/lib64/netPrnctl.so) undefined symbol: ppdOpenFile (/usr/lib64/netPrnctl.so) undefined symbol: libusb_init (/usr/lib64/netPrnctl.so) undefined symbol: libusb_get_device_descriptor (/usr/lib64/netPrnctl.so) undefined symbol: cupsBackendReport (/usr/lib64/netPrnctl.so) undefined symbol: libusb_free_device_list (/usr/lib64/netPrnctl.so) undefined symbol: libusb_claim_interface (/usr/lib64/netPrnctl.so) undefined symbol: cupsFileOpen (/usr/lib64/netPrnctl.so) undefined symbol: libusb_control_transfer (/usr/lib64/netPrnctl.so) undefined symbol: cupsFileGets (/usr/lib64/netPrnctl.so) undefined symbol: cupsArrayAdd (/usr/lib64/netPrnctl.so) undefined symbol: backendGetMakeModel (/usr/lib64/netPrnctl.so) undefined symbol: cupsArrayFind (/usr/lib64/netPrnctl.so) undefined symbol: _cups_strlcpy (/usr/lib64/netPrnctl.so) undefined symbol: cupsGetDests (/usr/lib64/netPrnctl.so) undefined symbol: cupsSideChannelWrite (/usr/lib64/netPrnctl.so) undefined symbol: httpAssembleURIf (/usr/lib64/netPrnctl.so)

發(fā)現(xiàn)動態(tài)庫沒有鏈接libusb 與 libcups 兩個庫,所以netPrnctl.so用到的這兩個的函數(shù)都沒有符號。
雖然構(gòu)建netPrnctl.so的c文件已包含libusb與cups函數(shù)的頭文件,編譯器做的工作僅是將源文件中以“文本形式”存在的源代碼翻譯成機器語言(二進制)的形式,并生成目標(biāo)文件(源代碼全部變成"二進制"的形式),在此期間對源代碼中的語法進行檢查,有語法錯誤則報錯,程序無法通過編譯。故編譯沒有錯誤僅是說明沒有語法上的問題。在實際調(diào)用時也可能出現(xiàn)其他情況。
通過上面的makefile看到,編譯生成了
OBJS = public.o prnctlAvision.o prnctlNetwork.o prnctl.o
這4個目標(biāo)文件。
而當(dāng)鏈接器進行鏈接的時候,會先把各個目標(biāo)文件在可執(zhí)行文件(ELF文件的一種,共享庫也是屬于其中)里面的位置確定下來,然后經(jīng)過一系列處理,直到把所有目標(biāo)文件的內(nèi)容都寫在可執(zhí)行文件中對應(yīng)的位置上,再經(jīng)過一些工作,就會生成一個可執(zhí)行程序。
由此判斷,netPrnctl.so依賴的libusb 與 libcups 兩個庫沒有鏈接上。

解決辦法

既然是因為沒有鏈接libusb 與 libcups,那么將這兩個庫鏈接上是不是就能解決問題?
首先查看這兩個庫的路徑。一般gcc里會有。

neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ ls /usr/lib/x86_64-linux-gnu/ | grep libcups libcupscgi.so.1 libcupsfilters.so.1 libcupsfilters.so.1.0.0 libcupsimage.so.2 libcupsmime.so.1 libcupsppdc.so.1 libcups.so.2 neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ ls /usr/lib/x86_64-linux-gnu/ | grep libusb libusb-1.0.a libusb-1.0.so libusbmuxd.so.4 libusbmuxd.so.4.0.0

于是將makefile進行調(diào)整,添加鏈接libusb 與 libcups的語句。

########################################################### # File: netPrnctl.so Makefile # Author: Neko ###########################################################CC = gcc CFLAGS = -Wall -g -fPICINCLUDE = -I./inc -I../ -I../cups -I../backend -I/usr/include/libusb-1.0 TARGET = netPrnctl.so LIBVAR = -lusb-1.0 -lcups LIBPATH = -L/usr/lib64/x86_64-linux-gnuvpath % .h ./incOBJS = public.o prnctlAvision.o prnctlNetwork.o prnctl.o SRCS = ./src/public.c ./src/prnctlAvision.c ./src/prnctlNetwork.c ./src/prnctl.c$(OBJS):$(SRCS)$(CC) $(CFLAGS) $(INCLUDE) -c $^all:$(OBJS)$(CC) -shared -fPIC -o $(TARGET) $(OBJS) $(LIBPATH) $(LIBVAR) -pthreadcp $(TARGET) /usr/bincp $(TARGET) /usr/lib64clean:rm -f *.orm -f netPrnctl.so

編譯時卻報錯

/usr/bin/ld: 找不到 -lcups

這里說一下:
出現(xiàn) /usr/bin/ld: cannot find(找不到) -lxxx
xxx表示函式庫文件名稱,如:libc.so、libltdl.so、libXtst.so。

命名規(guī)則是:lib+庫名(即xxx)+.so。

會發(fā)生這樣的原因有以下三種情形:

1 系統(tǒng)沒有安裝相對應(yīng)的lib

2 相對應(yīng)的lib版本不對

3 lib(.so檔)的symbolic link不正確,沒有連結(jié)到正確的函式庫文件(.so)

而libcups.so.2不符合命名規(guī)則。故報錯找不到。
解決辦法:
到libcups所在路徑下,鏈接新的符合規(guī)則的libcups.so

neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ cd /usr/lib/x86_64-linux-gnu neko@neko:/usr/lib/x86_64-linux-gnu$ sudo ln -s libcups.so.2 libcups.so neko@neko:/usr/lib/x86_64-linux-gnu$ cd - /home/neko/ZCPrinterDevice/NetworkSetupTool/filter neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ ls /usr/lib/x86_64-linux-gnu/ | grep libcups libcupscgi.so.1 libcupsfilters.so.1 libcupsfilters.so.1.0.0 libcupsimage.so.2 libcupsmime.so.1 libcupsppdc.so.1 libcups.so libcups.so.2

重新編譯成功,沒有報錯。再次調(diào)用測試,也沒有出現(xiàn)找不到符號的問題。

neko@neko:~/ZCPrinterDevice/NetworkSetupTool/filter$ ldd -r /usr/lib64/netPrnctl.solinux-vdso.so.1 (0x00007fff43f66000)libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007f4087f39000)libcups.so.2 => /usr/lib/x86_64-linux-gnu/libcups.so.2 (0x00007f4087cad000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4087a8e000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f408769d000)libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f408747f000)libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f4087234000)libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f4086ecf000)libavahi-common.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-common.so.3 (0x00007f4086cc3000)libavahi-client.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-client.so.3 (0x00007f4086ab2000)libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4086895000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f40864f7000)/lib64/ld-linux-x86-64.so.2 (0x00007f4088364000)librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f40862ef000)libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f4086019000)libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f4085de7000)libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f4085be3000)libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f40859d8000)libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f40856a9000)libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f408548c000)libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f408510e000)libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f4084efb000)libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007f4084cc5000)libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007f4084a91000)libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f4084810000)libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f40845c3000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f40843bf000)libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f40841bb000)libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f4083fa0000)libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f4083d98000)libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f4083b14000)liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f40838ee000)liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f40836d2000)libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f40833b7000)libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f40831a2000)

可以看到,依賴的庫基本都鏈接上了。

結(jié)語

所有錯誤都有原因,有跡可循。遇到問題不要急躁,靜心思考,理出種種可能導(dǎo)致問題的原因,再排除,找到根源去解決。搜索引擎和書籍是很好的工具,凡事先盡量自己想辦法,獨立解決問題也是一種能力。
參加工作半年,此時的我也只是一個剛進門的初級工程師。這些話是對我自己的告誡,也是對與我一樣在門內(nèi)探索的同學(xué)的建議,希望有所幫助。共勉。

總結(jié)

以上是生活随笔為你收集整理的undefined symbol 问题解决记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。