我只是不明白,为什么第22行无法编译?
#include <stdexcept>
#include <dlfcn.h>
#include "Library.h"
int main(int argc, char *argv[])
{
try
{
void* libHandle = 0;
libHandle = dlopen("libExpandableTestLibrary.so", RTLD_LAZY);
if(!libHandle)
throw std::logic_error(dlerror());
std::cout << "Libary opened gracefully" << std::endl;
void* fuPtr = 0;
fuPtr = dlsym(libHandle, "createLibrary");
if(!fuPtr)
throw std::logic_error(dlerror());
Library* libInstance = static_cast<Library* ()>(fuPtr)();
// Tutorial: http://www.linuxjournal.com/article/3687
// Tutorial Code: shape *my_shape = static_cast<shape *()>(mkr)();
// Compiler error message: Application.cpp:22:56: error: invalid static_cast from type ‘void*’ to type ‘Library*()’
libInstance->Foo();
dlclose(libHandle);
} catch(std::exception& ex)
{
std::cerr << ex.what() << std::endl;
}
}
欢迎任何帮助 如果您需要其他信息,请告诉我。
答案 0 :(得分:3)
我认为fuPtr
指向一个应该返回指向Library
对象的指针的函数(假设加载的名称为"createLibrary"
)。
在这种情况下,包含你的演员的行必须如下所示:
Library* libInstance = reinterpret_cast<Library* (*)()>(fuPtr)();
答案 1 :(得分:0)
从'void *'类型的static_cast无效到类型'Library *()'
在C ++中,在对象和函数指针类型之间进行转换是非法的(因为它们可能具有不同的大小)。
支持此作为扩展程序的大多数编译器都要求您使用reinterpret_cast
甚至是C风格的转换。
答案 2 :(得分:0)
“Library *()”不评估类型。试试“Library *(*)()”