У меня возникла проблема, когда я пытаюсь сохранить необработанный указатель в shared_ptr, и когда я возвращаю свой shared_ptr, я не могу использовать свой объект. Мой необработанный указатель получен из общей библиотеки.
Parser::ParserPtr Generator::Core::loadParser(const std::string &path) const noexcept {
LibHandler::DynamicLoader dl;
auto handler = dl.load(path);
if (!handler) {
BOOST_LOG_TRIVIAL(error) << "Failed to load parser. File: " << path;
return nullptr;
}
auto foo = dl.getFunction<Parser::ParserInstanceFunction>(handler, "CreateParser");
if (!foo) {
BOOST_LOG_TRIVIAL(error) << "Failed to load parser function. File: " << path;
return nullptr;
}
auto parser = Parser::ParserPtr((*foo)(), [](auto p){
std::cout << "Delete pointer" << std::endl;
});
if (!parser) {
BOOST_LOG_TRIVIAL(error) << "Failed to create instance of IParser. File: " << path;
return nullptr;
}
std::cout << parser->getName() << std::endl;
return std::move(parser);
}
Так что здесь parser->getName()
работает.
int Generator::Core::start(const std::string &parserPath) const noexcept {
auto iParser = this->loadParser(parserPath);
if (!iParser)
return EXIT_FAILURE;
std::cout << typeid(iParser).name() << std::endl;
std::cout << iParser->getName() << std::endl;
}
return EXIT_SUCCESS;
}
Здесь нет ... Я не понимаю, почему.
Чтобы экспортировать мою функцию в моей библиотеке, я использую:
#ifndef EXTERN_C
# ifdef __cplusplus
# define EXTERN_C extern "C"
# else
# define EXTERN_C extern
# endif
#endif
#if defined(SYS_LINUX) || defined(SYS_DARWIN)
# define EXPORT
#elif defined(SYS_WIN)
# define EXPORT __declspec(dllexport)
#endif
PARSER_MAKE_ENTRY_POINT(class) EXTERN_C EXPORT Parser::IParser *CreateParser() { return new class(); }