代码之家  ›  专栏  ›  技术社区  ›  metablaster

dllexport函数未导出

  •  0
  • metablaster  · 技术社区  · 6 年前

    我已经按照msdn文档做了所有的事情,但是我的函数仍然没有被导出。 LINK1 LINK2 LINK3

    以下是我所拥有的(从dll导入的2个项目、dll和app)如下(短版本):

    dll函数.h

    #prgma once
    #ifdef COMPILE_DLL
    #define EXPORT __declspec(dllexport)
    #else
    #define EXPORT __declspec(dllimport)
    #endif // COMPILE_DLL
    
    namespace wsl
    {
            EXPORT bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y);
    }
    

    dll函数.cpp

    #include "functions.h"
    
    namespace wsl
    {
        bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
        {
             // implementation...
             return true;
        }
    }
    

    dll dllmain.cpp

    #include <Windows.h>
    BOOL APIENTRY DllMain(
        [[maybe_unused]] HMODULE hModule,
        DWORD  ul_reason_for_call,
        [[maybe_unused]] LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    

    注: dll项目中还有其他几个头文件和cpp文件,都在编译中,但没有导出函数。

    应用程序main.cpp

    #include "functions.h"
    
    int main()
    {
        wsl::PointInTriangle(0, 0, 20, 0, 10, 30, 10, 15);
        return 0;
    }
    

    程序输出:

    2>main.obj:错误LNK2019:未解析的外部符号 “\uu declspec(dllimport)布尔cdecl” wsl::pointincirclesector(int,int,int,float,float)“ (?函数中引用的pointincirclesector@wsl@ya\nhhhmm@z) main 2>main.obj:错误LNK2019:未解析的外部符号 “\uu declspec(dllimport)布尔cdecl” wsl::点Intriangle(int,int,int,int,int,int,int,int,int) (?在函数中引用的pointintriangle@wsl@ya\nhhhhhh@z) main 2>main.obj:错误LNK2019:未解析的外部符号 “\uu declspec(dllimport)布尔cdecl” wsl::PointInEllipse(int,int,int,int,int,int)“ (?函数main中引用的pointinellipse@wsl@@ya\u nhhhhh@z) 2>main.obj:错误LNK2019:未解析的外部符号 “\uu declspec(dllimport)布尔cdecl” wsl::PointInCircle(int,int,int,int,int)“ (?在函数main中引用的pointincrcle@wsl@@ya@nhhhh@z) 2>main.obj:错误LNK2019:未解析的外部符号 “\uu declspec(dllimport)布尔cdecl” wsl::PointInRectangle(int,int,int,int,int,int)“ (?函数中引用的pointinrectangle@wsl@@ya\nhhhhh@z) 主2>C:\users\user\source\repos\windowsuperlibrary\x64\debug dll\mathsample.exe:致命错误LNK1120:5个未解析的外部 2>已完成生成项目“mathsample.vcxproj”--失败。

    你能解释一下这里有什么问题吗?

    我已经在DLL上运行了垃圾箱/出口,并且可以确认没有导出任何函数。

    COMPILE_DLL 宏当然是在dll项目中定义的。

    我确实在我的项目中包含了导入库。

    头文件和cpp文件中的命名空间名称相同。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Adrian Mole Chris    6 年前

    为了实际导出在源文件中声明的dll函数,必须执行以下两项操作之一:

    或者(1)添加 __declspec(dllexport) 函数的属性 在定义它的源中 (不仅仅是在标题中)。

    或(2)将函数添加到 EXPORTS 在模块定义文件(.def)中。

    可用的文档(尤其是较旧的文档)倾向于假定使用.def文件 出口 方法,可能相当误导。