// 加载动态库
Status LoadLibrary(const char* library_filename, void** handle) {
*handle = dlopen(library_filename, RTLD_NOW | RTLD_LOCAL);
if (!*handle) {
return errors::NotFound(dlerror());
}
return Status::OK();
}
// 加载symbol
Status GetSymbolFromLibrary(void* handle, const char* symbol_name,
void** symbol) {
*symbol = dlsym(handle, symbol_name);
if (!*symbol) {
return errors::NotFound(dlerror());
}
return Status::OK();
}
加载库
#include "third_party/hadoop/hdfs.h"
Status BindFunc(void* handle, const char* name,
std::function<R(Args...)>* func) {
void* symbol_ptr = nullptr;
TF_RETURN_IF_ERROR(
Env::Default()->GetSymbolFromLibrary(handle, name, &symbol_ptr));
*func = reinterpret_cast<R (*)(Args...)>(symbol_ptr);
return Status::OK();
}
class LibHDFS {
public:
static LibHDFS* Load() {
static LibHDFS* lib = []() -> LibHDFS* {
LibHDFS* lib = new LibHDFS;
lib->LoadAndBind();
return lib;
}();
return lib;
}
// The status, if any, from failure to load.
Status status() { return status_; }
std::function<hdfsFS(hdfsBuilder*)> hdfsBuilderConnect;
std::function<hdfsBuilder*()> hdfsNewBuilder;
std::function<void(hdfsBuilder*, const char*)> hdfsBuilderSetNameNode;
std::function<int(const char*, char**)> hdfsConfGetStr;
std::function<int(hdfsFS, hdfsFile)> hdfsCloseFile;
std::function<tSize(hdfsFS, hdfsFile, tOffset, void*, tSize)> hdfsPread;
std::function<tSize(hdfsFS, hdfsFile, const void*, tSize)> hdfsWrite;
std::function<int(hdfsFS, hdfsFile)> hdfsHFlush;
std::function<int(hdfsFS, hdfsFile)> hdfsHSync;
std::function<tOffset(hdfsFS, hdfsFile)> hdfsTell;
std::function<hdfsFile(hdfsFS, const char*, int, int, short, tSize)>
hdfsOpenFile;
std::function<int(hdfsFS, const char*)> hdfsExists;
std::function<hdfsFileInfo*(hdfsFS, const char*, int*)> hdfsListDirectory;
std::function<void(hdfsFileInfo*, int)> hdfsFreeFileInfo;
std::function<int(hdfsFS, const char*, int recursive)> hdfsDelete;
std::function<int(hdfsFS, const char*)> hdfsCreateDirectory;
std::function<hdfsFileInfo*(hdfsFS, const char*)> hdfsGetPathInfo;
std::function<int(hdfsFS, const char*, const char*)> hdfsRename;
private:
void LoadAndBind() {
auto TryLoadAndBind = [this](const char* name, void** handle) -> Status {
TF_RETURN_IF_ERROR(Env::Default()->LoadLibrary(name, handle));
#define BIND_HDFS_FUNC(function) \
TF_RETURN_IF_ERROR(BindFunc(*handle, #function, &function));
BIND_HDFS_FUNC(hdfsBuilderConnect);
BIND_HDFS_FUNC(hdfsNewBuilder);
BIND_HDFS_FUNC(hdfsBuilderSetNameNode);
BIND_HDFS_FUNC(hdfsConfGetStr);
BIND_HDFS_FUNC(hdfsCloseFile);
BIND_HDFS_FUNC(hdfsPread);
BIND_HDFS_FUNC(hdfsWrite);
BIND_HDFS_FUNC(hdfsHFlush);
BIND_HDFS_FUNC(hdfsTell);
BIND_HDFS_FUNC(hdfsHSync);
BIND_HDFS_FUNC(hdfsOpenFile);
BIND_HDFS_FUNC(hdfsExists);
BIND_HDFS_FUNC(hdfsListDirectory);
BIND_HDFS_FUNC(hdfsFreeFileInfo);
BIND_HDFS_FUNC(hdfsDelete);
BIND_HDFS_FUNC(hdfsCreateDirectory);
BIND_HDFS_FUNC(hdfsGetPathInfo);
BIND_HDFS_FUNC(hdfsRename);
#undef BIND_HDFS_FUNC
return Status::OK();
};
// libhdfs.so won't be in the standard locations. Use the path as specified
// in the libhdfs documentation.
#if defined(PLATFORM_WINDOWS)
const char* kLibHdfsDso = "hdfs.dll";
#elif defined(MACOS) || defined(TARGET_OS_MAC)
const char* kLibHdfsDso = "libhdfs.dylib";
#else
const char* kLibHdfsDso = "libhdfs.so";
#endif
char* hdfs_home = getenv("HADOOP_HDFS_HOME");
if (hdfs_home != nullptr) {
string path = io::JoinPath(hdfs_home, "lib", "native", kLibHdfsDso);
status_ = TryLoadAndBind(path.c_str(), &handle_);
if (status_.ok()) {
return;
}
}
// Try to load the library dynamically in case it has been installed
// to a in non-standard location.
status_ = TryLoadAndBind(kLibHdfsDso, &handle_);
}
Status status_;
void* handle_ = nullptr;
};
今天的文章c++ dlopen、dlsym分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10273.html