ldd 如何确定依赖共享库的位置

时间:2021-05-21 11:00:53

程序需要用到其他Team写的库,更新新库(从Adfin_6.20141.3.20更新到Adfin_6.20152.6.20)后,执行程序报错:

symbol lookup error:  undefined symbol: _ZN5Adfin10OpFunction15OpImpliedStrikeEddddRK11CFloatRangeS3_S3_RK9CAdStringS6_S6_Rd


#ldd debug/x86_64/ats

libadfapi.so => /ATSDev/ATS15/ATS15ENV/adfin/Adfin_6.20141.3.20/lib/x86_64/release/64/shared/libadfapi.so (0x00007f9219419000)

libadfcfo.so => /ATSDev/ATS15/ATS15ENV/adfin/Adfin_6.20141.3.20/lib/x86_64/release/64/shared/libadfcfo.so (0x00007f9218f2c000)


可以看到程序执行的时候找到的依赖库依然是Adfin_6.20141.3.20,两个版本的库对函数OpImpliedStrike的声明不同,所以,执行报错。

可是我在Makefile.host文件中已经做了更改,重新指定了动态共享库的路径

CC  ...    -L /ATSDev/ATS15/ATS15ENV/adfin/Adfin_6.20152.6.20/lib/x86_64/release/64/shared/


但是这个只能保证链接的时候,找到了正确的库文件,并且告知可执行文件依赖libadfapi.so和libadfcfo.so。

执行的时候,OS需要重新为可执行文件找动态库文件,去哪儿找呢?

环境变量LD_LIBRARY_PATH指定的路径


#echo $LD_LIBRARY_PATH

/ATSDev/ATS15/ATS15ENV/adfin/Adfin_6.20141.3.20/lib/x86_64/release/64/shared/


果然,OS在程序运行前,查找到在$LD_LIBRARY_PATH目录下有程序执行时依赖的同名库文件,所以,执行的时候,调用的还是旧的库文件。

重新设置环境变量LD_LIBRARY_PATH,指到新版本库文件的路径后,运行OK。