gpt4 book ai didi

c++ - 在 gcc 中提供函数别名?

转载 作者:行者123 更新时间:2023-11-30 04:07:10 30 4
gpt4 key购买 nike

我正在寻找一种方法来为使用 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 只是不支持导出函数的未损坏的别名?

最佳答案

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

normalName=mangled_name @ 1

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

关于c++ - 在 gcc 中提供函数别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582666/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com