函数指针调用无法编译

时间:2011-11-23 16:42:27

标签: c++ shared-libraries function-pointers

我只是不明白,为什么第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;
    }
}

欢迎任何帮助 如果您需要其他信息,请告诉我。

3 个答案:

答案 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 *(*)()”