我有一个 C 程序,我在其中通过函数名称“动态”获取函数指针(即,我将函数名称作为字符串传递并获取指向函数的指针)。我已经在 Linux 中使用 dlopen 和 dlsym 做到了这一点,我想它也可以在任何其他类 Unix 中使用dlfcn。
当我尝试使用 MinGW 将该程序移植到 Windows 时,问题就开始了。当我尝试使用“GetProcAddress(handle, symbol_name)”查找名称时,其中“symbol_name”是我的回调函数的名称,“handle”是“GetModuleHandle(NULL)”返回的当前可执行文件的句柄,我什么也没得到因为 MinGW 名称修饰在我的符号名称中添加了一个“_”。
显而易见的解决方案(在我想要的符号前加上“_”)对于可移植性似乎有点“危险”(编译器可以为其中一些添加两个下划线吗?我不知道),所以,我问:
有更好的方法来防止编译器对我的符号进行名称修改吗?(或其中的一个子集,只有我需要动态查找的回调);
或者一种让 GetProcAddress 即使在损坏时也能找到它们的方法?
我还尝试了选项-fno-leading-underscore,但它也删除了所有外部符号的修饰,使程序无法与 stdlib 等链接(另外,文档上的警告有点吓人)。
另外,请注意我使用的是纯 C——我的代码的任何部分都没有 C++——我所有的代码都存在于一个“.exe”中。
TIA