我可以在libleveldb.a中找到符号,但是当我创建共享库时,找不到相同的符号。

i can find the symbol in libleveldb.a,but when i create the shared library,failed to find the same symbol.what's wrong?

本文关键字:符号 共享 创建 找不到 libleveldb 我可以      更新时间:2023-10-16

我已经创建了一个leveldb的java客户端来适应YCSB,并且需要使用JNI。所以我基于libleveldb.a构建了共享库,但它产生了一些错误。

测试.cpp:

#include <leveldb/db.h>
#include <iostream>
int main()
{
        leveldb::DB* db;
        leveldb::Options options;
        options.create_if_missing = true;
        leveldb::Status status = 
        leveldb::DB::Open(options,"/tmp/testdb", &db);
        assert(status.ok());

制作文件:

g++ test.cpp -fPIC -shared -o libTest.so

我希望我可以在 .so 文件中找到_ZN7leveldb7OptionsC1Ev符号。但符号输出为:

$ daniel@daniel-MS-7A74:~/leveldb/test_zdn$ readelf -s libTest.so|grep leveldb7Options
10: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZN7leveldb7OptionsC1Ev
63: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZN7leveldb7OptionsC1Ev
$ daniel@daniel-MS-7A74:~/leveldb/test_zdn$ readelf -s test.o|grep leveldb7Options
1882: 0000000000037dc4   183 FUNC    GLOBAL DEFAULT   14 _ZN7leveldb7OptionsC1Ev
2628: 0000000000037dc4   183 FUNC    GLOBAL DEFAULT   14 _ZN7leveldb7OptionsC2Ev

shndx 列在 libTest.so 中未定义

我误解了链接过程,那是因为静态库有未定义的符号就可以了。 静态库是目标文件的存档,OBJ可以有UND符号。 但是,使用静态库时必须添加依赖库(与动态库相同)。

https://blog.csdn.net/tom06/article/details/80309864