如何调试错误"Symbol lookup error: undefined symbol"



我创建了一个应用程序(api_tests(,该应用程序使用链接到oracle occi库(libocci.so.12.1(的库(libstorage.so(并对其进行了编译。当我运行这个应用程序时,我得到一个错误:

api_tests
api_tests: symbol lookup error: ./libstorage.so: undefined symbol: _ZN6oracle4occi11Environment17createEnvironmentENS1_4ModeEPvPFS3_S3_mEPFS3_S3_S3_mEPFvS3_S3_E

但是,这个带有此符号的库存在于当前目录中:

ls | grep libocci
libocci.so*
libocci.so.11.1*
libocci.so.12.1*
nm libocci.so.12.1 | grep _ZN6oracle4occi11Environment17createEnvironmentENS1_4ModeEPvPFS3_S3_mEPFS3_S3_S3_mEPFvS3_S3_E
0000000000097e70 T _ZN6oracle4occi11Environment17createEnvironmentENS1_4ModeEPvPFS3_S3_mEPFS3_S3_S3_mEPFvS3_S3_E
0000000000125014 r _ZN6oracle4occi11Environment17createEnvironmentENS1_4ModeEPvPFS3_S3_mEPFS3_S3_S3_mEPFvS3_S3_E$$LSDA

当前路径添加到LD_LABRARY_path:

echo $LD_LIBRARY_PATH
./:/usr/vacpp/bin/../lib:/lib

我想知道我的库可能出了什么问题,以及如何调试这个问题?

更新:看起来这个库没有链接(至少ldd没有显示这个依赖项(。我想它在makefile中是错误的,它被编译了,但在运行时失败了。

nm libocci.so.12.1

上面的命令有两个问题:

  1. 您不知道libocci.so.12.1是否真的被加载到您的流程中。要回答"正在加载哪个libocci",请使用LD_DEBUG=libs运行
  2. 仅仅因为符号存在于libocci.so.12.1的符号表中并不意味着它可用于动态链接。它必须动态符号表中可用,您可以使用nm -D libocci.so.12.1进行检查

最新更新