我可以在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?
我已经创建了一个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
相关文章:
- 为什么我的共享库中存在展开符号
- 仅在少数方法(静态或共享库)中解析的外部符号
- 共享对象、符号、C/C++ 库链接和加载
- 共享对象中的符号
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 使用共享库编译可执行文件时仅链接所需的符号
- 为什么 std:: 符号在共享库中被强制导出?
- 使用 C++ 标准库避免共享库中的符号冲突
- 隐藏共享库中的"_init"和"_fini"符号
- 共享对象中的符号名称与文件中.cpp函数不同
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 共享库中使用"使用命名空间"定义的符号错误
- GCC 中使用 -O3 的共享库编译不会导出与 -O0 中那样多的符号
- Cython:共享对象中未定义的符号
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 尝试与从 CUDA 对象构建的共享库链接时未定义的符号
- 在链接链接静态(GSOAP)库的共享库时,为什么会得到一个未定义的符号
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 静态库将转换为共享的lib符号隐藏
- 在共享C++库中加载共享库时C++未定义的符号,该库本身由 Python 加载