我有一个最初用 MSVS 编写的库 (dll),我需要制作跨平台 (Mac/Win)。我开始使用 XCode,但有了新的 Embarcadero C++ builder XE3,我认为一个开发环境会是更好的选择。宿主应用程序是用 Delphi 编写的,因此更有理由将其移至一组工具。
对于我现有的代码,一切都是 cdecl 但我无法让它在 C++ builder 上工作。如果我将它转换为stdcall,那么它可以正常工作,但据我所知,在OSX下使用库时我需要使用cdecl。
在 MSVC 中,我像这样导出我的函数:
extern "C" __declspec(dllexport) int Init(char * init_dir, DebugCallbackFunc f, DeviceCallbackFunc f1)
在 C++ Builder 中,我像这样导出:
extern "C" __declspec( dllexport ) int _cdecl Init(char * init_dir, DebugCallbackFunc f, DeviceCallbackFunc f1)
问题是,当我使用 cdecl 时,Delphi 主机应用程序总是使用 GetProcAddress 返回 NULL,但如果我将其更改为 stdcall,则工作正常。
TUDMXInit = function(p: PAnsiChar; f: TDebugCallbackFunc; f1: TDeviceCallbackFunc): integer; cdecl;
我还将欣赏一个处理“_”的最佳方法的示例,该示例假定在 OSX 下作为导出函数的前缀。我应该只使用条件将其添加到所有函数的前面吗?
提前致谢。马丁