1

我想使用 Microsoft Linker 从我的目标文件中手动导出函数。当我为每个函数使用参数时,它工作正常,如下所示:

/Export:ExportedFunction1$qqsv /Export:ExportedFunction2$qqsv and so on...

然后链接器会自动正确地分配排序。但是在导出表中,实际的导出名称是“ ExportedFunction1$qqsv/ExportedFunction2$qqsv/etc..”我尝试了这样的参数:

/Export:ExportedFunction1$qqsv,1,ExportedFunction1 /Export:ExportedFunction2$qqsv,2,ExportedFunction2

但我认为我使用的参数错误?!如何正确使用 /Export 参数为导出分配我自己的名称?

PS.:我正在使用 Microsoft (R) 增量链接器版本 7.00.9210

4

3 回答 3

3
#pragma comment(linker, "/EXPORT:ExportedFunction1$qqsv=_YouMangledFunction1@@")
#pragma comment(linker, "/EXPORT:ExportedFunction2$qqsv=_YouMangledFunction2@@")
于 2013-02-19T13:26:01.950 回答
2

我不相信您可以使用 /Export 命令行开关获得这种控制,但您可以使用 .DEF 文件来实现:

https://docs.microsoft.com/en-us/cpp/build/reference/exports

于 2013-02-18T21:21:21.260 回答
1

这是一个带有 DEF 文件的示例解决方案。

DLL 项目:

CppLib.h:

#ifdef CPPLIB_EXPORTS
#define CPPLIB_API __declspec(dllexport)
#else
#define CPPLIB_API __declspec(dllimport)
#endif

CPPLIB_API double MyFunction1(double);

CppLib.cpp:

CPPLIB_API double MyFunction1(double dd)
{
    return dd;
}

CppLib.def:

LIBRARY

EXPORTS
MySuperFunction=MyFunction1 @1

构建 DLL。

如果我们在 CppLib.DLL 上运行 dumpbin,我们会得到:

...
    ordinal hint RVA      name

          2    0 0001101E ?MyFunction1@@YANN@Z = @ILT+25(?MyFunction1@@YANN@Z)
          1    1 0001101E MySuperFunction = @ILT+25(?MyFunction1@@YANN@Z)
...

使用 CppLib.dll 的控制台应用程序:

#include "CppLib.h"

#include <Windows.h>
#include <iostream>

int main()
{
    typedef double(*MY_SUPER_FUNC)(double);

    HMODULE hm = LoadLibraryW(L"CppLib.dll");
    MY_SUPER_FUNC fn1 = (MY_SUPER_FUNC)GetProcAddress(hm, "MySuperFunction"); // find by name
    MY_SUPER_FUNC fn2 = (MY_SUPER_FUNC)GetProcAddress(hm, MAKEINTRESOURCEA(1)); // find by ordinal

    std::cout << fn1(34.5) << std::endl; // prints 34.5
    std::cout << fn2(12.3) << std::endl; // prints 12.3

    return 0;
}
于 2013-02-20T20:02:20.140 回答