【问题标题】:Providing a function alias in gcc?在 gcc 中提供函数别名?
【发布时间】:2014-03-22 19:46:58
【问题描述】:

我正在寻找一种方法来为使用 GCC 编译的 DLL 中的导出函数定义未损坏的别名。

根据this StackOverflow answer,Visual Studio 支持

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

指定导出的函数应具有给定的别名。我在 GCC 中寻找类似的东西。 The GCC function attribute docs 建议 __attribute__ ((alias ("target"))) 可以解决问题,但这只会生成一个损坏的函数名称:

#undef DLL_EXPORT
#ifdef CCDLL_EXPORTS
#define DLL_EXPORT __stdcall __declspec(dllexport)
#else
#define DLL_EXPORT __stdcall __declspec(dllimport)
#endif

DLL_EXPORT CCDLL_v1* GetCCDLL_premangled();

DLL_EXPORT CCDLL_v1* GetCCDLL () __attribute__ ((alias ("_Z19GetCCDLL_premangledv")));

这是生成的 DLL 中的 .def 文件:

EXPORTS
    _Z19GetCCDLL_premangledv @1
    _Z8GetCCDLLv @2

原始函数按预期导出和修改,但函数别名也是如此。如果我从函数别名中删除DLL_EXPORT,我希望它不会损坏,但它也不会从 DLL 中导出。我认为 stdcall 调用约定可能会破坏函数别名,但是当我从 DLL_EXPORT 定义中删除它时,.def 文件仍然完全相同。

This SO answer 建议我可以使用--defsym=alias_name=target 定义一个别名,但 ld 似乎无法识别这一点,我在 official GCC linker docs 中根本找不到任何东西。

有没有办法做我正在寻找的,或者 GCC 只是不支持导出函数的未损坏别名?

【问题讨论】:

    标签: c++ gcc dll


    【解决方案1】:

    您是否在 .def 文件中尝试过:

    normalName=mangled_name @ 1
    

    另一种方法可能是定义一个调用内部 C++ 的外部“C”函数,然后将其导出。

    【讨论】:

    • 小心,任何(直接或间接)使用 C++ 特性的东西在从普通 C 调用时将不起作用
    • .def 文件完美运行。我一直在设置错误;感谢您展示正确的方法。
    • @vonbrand 你能开发吗?多年来,我一直在使用 extern "C" C++ 函数的包装器来使用我的 C 代码中的 C++ 的 opencv。我唯一需要做的就是在接口中使用void * 来围绕C 函数传递指向C++ classes 的指针。即使使用-O3 -flto,一切正常,所以根据我的经验,它会工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多