【问题标题】:GCC exports decorated function name only from dllGCC 仅从 dll 导出修饰函数名
【发布时间】:2011-01-31 03:01:16
【问题描述】:

我有一个 dll,它导出一个函数...

extern "C"
int __stdcall
MP_GetFactory( gmpi::IMpUnknown** returnInterface )
{
}

我使用 Code::Blocks GCC 编译器 (V3.4.5) 编译它。问题:生成的 dll 导出修饰函数名...

MP_GetFactory@4

加载失败,应该是旧的...

MP_GetFactory

我已经研究了大约 4 个小时。我认为 --add-stdcall-alias 是解决此问题的选项。我的 Code::Blocks 日志显示...

mingw32-g++.exe -shared -Wl,--out-implib=bin\Debug\libGainGCC.a -Wl,--dll obj\Debug\se_sdk3\mp_sdk_audio.o obj\Debug\se_sdk3\mp_sdk_common.o obj\Debug\Gain\Gain.o obj\Debug\Gain\gain.res -o bin\Debug\GainGCC.sem --add-stdcall-alias -luser32

..所以我认为这是正确的选择吗?但没有运气。 Dependancy Walker 仅显示正在导出的修饰名称。 我通过使用 __cdecl 而不是 __stdcall 让它有点工作,然后可以导出名称,但是该函数在调用时会破坏堆栈(因为调用者期望其他调用约定)。

【问题讨论】:

    标签: c++ gcc dll stdcall name-decoration


    【解决方案1】:

    不好意思回答我自己的问题,终于弄明白了。

    项目/构建选项/链接器/其他链接器选项 -Wl,--kill-at

    ...杀死装饰'@'符号等。

    【讨论】:

      【解决方案2】:

      我认为应该是 -Wl,--add-stdcall-alias 和“kill-at”技巧会使生成的导入库文件无法使用。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        相关资源
        最近更新 更多