【问题标题】:Calling a function in a shared library given its name and signature在给定名称和签名的情况下调用共享库中的函数
【发布时间】:2011-06-13 01:30:31
【问题描述】:

我有一个小 DSL,它需要能够加载共享库并运行它们导出的函数。最后,一个解决的问题:dlopendlsymLoadLibraryGetProcAddress 是你跨平台使用动态库所需要的。这很容易!

C++ 不同意。

感谢dlsym 等,我得到了我需要的一切:来自库的函数指针、来自源文件的签名表示,以及……无法使用另一个调用一个。

我只是想确认一下我的想法,如果我拥有的所有类型信息都是动态的,那么使用可变参数、可变参数模板或其他魔法将无济于事。我将采用以下解决方案之一,并且还想就哪个更可取提出意见(我倾向于后者)。

  • 将签名限制为接受和返回编组的对象指针,并为要使用该语言的每个库编写一个包装器。

  • 将 DSL 编译为与 C 兼容的语言(阅读:C++),以便在编译时(阅读:第二次编译)可获得必要的信息。

【问题讨论】:

    标签: c++ dll programming-languages shared-libraries


    【解决方案1】:

    使用libffi 调用函数。如果你有一个指向函数的指针,并且你知道它的参数和返回类型,那么你就是金子。 Ffi 知道如何处理特定于平台的 ABI、构建堆栈框架、推送参数和弹出返回值等。

    C++ 名称修改使这变得更加困难,但如果您已经设法获得一个函数指针,那么听起来您已经解决了这部分问题......

    【讨论】:

    • 优秀。这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2022-01-16
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多