首页 文章

如何调试错误“符号查找错误:未定义符号”

提问于
浏览
1

我创建了一个app(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中的错误,它被编译但在运行时失效 .

1 回答

  • 1

    nm libocci.so.12.1

    上面的命令有两个问题:

    • 您不知道 libocci.so.12.1 是否实际上已加载到您的流程中 . 要回答"which libocci is getting loaded",请使用 LD_DEBUG=libs 运行 .

    • 只是因为符号存在于 libocci.so.12.1 的符号表中,因此可用于动态链接 . 它必须在动态符号表中可用,您可以使用 nm -D libocci.so.12.1 进行检查

相关问题