Ole*_*kov 10 c++ linker shared-libraries
我创建了一个应用程序 (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
Run Code Online (Sandbox Code Playgroud)
但是这个带有这个符号的库存在于当前目录中:
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
Run Code Online (Sandbox Code Playgroud)
当前路径添加到 LD_LABRARY_PATH:
echo $LD_LIBRARY_PATH
./:/usr/vacpp/bin/../lib:/lib
Run Code Online (Sandbox Code Playgroud)
我想知道我的库有什么问题以及如何调试问题?
更新:看起来这个库没有链接(至少 ldd 没有显示这个依赖项)。我猜它是 makefile 中的错误,它被编译但在运行时失败。
nm libocci.so.12.1
上述命令有两个问题:
libocci.so.12.1
真正加载到您的流程中。要回答“正在加载哪个 libocci”,请使用LD_DEBUG=libs
.libocci.so.12.1
并不意味着它可用于动态链接。它必须在动态符号表中可用,您可以使用它进行检查nm -D libocci.so.12.1