鍍金池/ 問答/C  C++  Linux  網(wǎng)絡(luò)安全/ gcc生成的動(dòng)態(tài)庫鏈接時(shí)提示函數(shù)undefined reference to

gcc生成的動(dòng)態(tài)庫鏈接時(shí)提示函數(shù)undefined reference to

環(huán)境:使用了一個(gè)第三方庫mxml,在A.h中引用mxml.h,(第三方庫的頭文件),A.c中完成實(shí)現(xiàn)代碼。
編譯、運(yùn)行:編譯運(yùn)行的時(shí)候鏈接第三方庫,輸出結(jié)果正常。

這時(shí)候想要將A.c編譯成.so,只提供A.h作為頭文件供外部調(diào)用。

gcc -c A.c
gcc -fPIC -shared A.o -o libmya.so

生成了動(dòng)態(tài)庫libmya.so

gcc main.c A.h -L. -lmya  -o main

運(yùn)行可執(zhí)行文件main的時(shí)候報(bào)錯(cuò):
圖片描述

但是我通過nm命令,nm libmya.so查詢我的so,這些函數(shù)是在里面的。
圖片描述

為什么so庫中存在這些第三方庫提供的函數(shù),但是我實(shí)際調(diào)用的時(shí)候卻會報(bào)錯(cuò)?

回答
編輯回答
嘟尛嘴
  1. 你nm命令看到的那些符號的“U”表示未定義的,你可以看到它們前面沒有內(nèi)存地址信息,這些符號是定義在你引入的mxml庫中的。

  2. 你是在生成可執(zhí)行程序main的失敗報(bào)錯(cuò)的吧,如果是在編譯的時(shí)候再加上-lmxml選項(xiàng),并使用-L選項(xiàng)指定mxml庫所在的目錄。

  3. 運(yùn)行時(shí)可能會遇到提示找不到libmxml.so**庫的錯(cuò)誤提示,可以把libmxml.so**庫發(fā)布到/usr/lib64目錄下,或者把libmxml.so**所在目錄配置到/etc/ld.so.conf中,然后執(zhí)行l(wèi)dconfig即可。

2017年9月9日 20:58