【问题标题】:Build DLL in MinGW/MSYS2 without declspec(dllexport)在没有 declspec(dllexport) 的 MinGW/MSYS2 中构建 DLL
【发布时间】:2017-09-14 03:58:20
【问题描述】:

有没有什么方法可以在 MinGW/MSYS2 中编译带有所需导出符号的 Windows DLL,而不用 _declspec(dllexport) 注释源代码?

【问题讨论】:

    标签: dll mingw msys2


    【解决方案1】:

    你可能已经解决了这个问题,已经一年多了,但其他人可能有这个问题,所以:

    是的,在 MinGW 中您不必添加 declspec(dllexport),一个很好的理由可能是您只想使用其他人的库源而不修改/分叉它。

    这是一个示例 lib.c,它将被编译成 DLL 并使用下面的 Makefile 导出 func

    int func(int A) {
        return A*2;
    }
    

    还有一个 lib.h 用于在可执行文件中使用:

    typedef int func_type(int A);
    

    Makefile,但请确保您修复了缩进:两个缩进的行需要一个制表符而不是 4 个空格:

    all: lib.dll ex.exe
    
    lib.dll: lib.c
        gcc -o lib.dll -shared lib.c -Wall
    
    ex.exe: ex.c
        gcc -o ex.exe ex.c -Wall
    

    请注意,-shared 是使输出成为有效 DLL 并使其导出 func 的原因。

    示例 ex.c 用于测试目的:

    #include <stdio.h>
    #include <windows.h>
    #include <assert.h>
    #include "lib.h"
    int main(void) {
        void* Lib = LoadLibraryW(L"lib.dll");
        assert(Lib);
        func_type (*func) = (func_type*)GetProcAddress(Lib, "func");
        assert(func);
        printf("%i\n", func(11)); // should output 22
        return 0;
    }
    

    【讨论】:

    • 感谢您的回答。老实说,我不记得我做了什么,所以我无法标记它,但你得到了支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多