MinGw 生成Dll的连接库 无参数调用

本文介绍了一个使用pexports工具导出Lua 5.1 DLL的示例,并展示了如何通过C语言调用DLL中的函数。示例中包含了定义、声明及具体的函数调用过程。
  1. pexports -o lua5.1.dll >lua5.1.def
    dlltool -D lua5.1.dll -l lua5.1.a -d lua5.1.def
  2. #include<stdio.h>
    #include
    <malloc.h>
    #include
    <assert.h>

    typedef
    void(__stdcall*func_call)();

    void__stdcallfoo(inta,intb)
    ...{
    printf(
    "%d,%d ",a,b);
    }


    voidcheck(void*arg)
    ...{
    assert((
    void**)arg-&arg==1);
    }


    voidtest()
    ...{
    int*arg=(int*)_alloca(2*sizeof(int));
    arg[
    0]=1;
    arg[
    1]=2;
    check(arg);
    ((func_call)foo)();
    }



    voidmain()
    ...{
    test();
    }

<think>我们正在讨论如何使用MinGW生成DLL文件。根据引用内容,我们可以总结出以下步骤和注意事项: 1. **准备编译环境**:确保已安装MinGW,并配置好环境变量,以便在命令行中使用gcc/g++等工具。 2. **编写源代码**:创建需要导出为DLL的源文件,注意使用`__declspec(dllexport)`关键字导出函数(Windows平台特有)。 3. **编译生成DLL**:使用MinGW的gcc/g++编译器,通过命令行参数`-shared`来生成DLL文件,同时可能需要使用`-Wl,--out-implib,libxxx.a`参数生成对应的导入(.a文件)。 具体步骤: **步骤1:编写一个简单的DLL源文件** 例如,创建`mydll.c`: ```c #include <stdio.h> __declspec(dllexport) void hello() { printf("Hello from DLL!\n"); } ``` **步骤2:使用MinGW生成DLL** 打开命令提示符,进入源文件目录,执行: ```bash gcc -shared -o mydll.dll mydll.c -Wl,--out-implib,libmydll.a ``` 这里: - `-shared`:指示生成共享DLL)。 - `-o mydll.dll`:指定输出的DLL文件名。 - `-Wl,--out-implib,libmydll.a`:告诉链接器生成导入(.a文件),供其他程序链接该DLL时使用。 **注意事项**: - 如果生成的是C++ DLL,为了防止名称修饰(name mangling),可以使用`extern "C"`包裹导出函数声明。 - 引用[2]提到,MinGW默认生成32位DLL。如果需要64位,需要使用MinGW-w64(一个独立的项目)。 - 引用[2]还提到,为了更好的兼容性(特别是兼容旧版Windows如WinXP),建议使用MinGW生成32位DLL,而64位DLL则可以使用MSVC生成(但MinGW-w64也可用于生成64位DLL)。 **生成导入(.a文件)**: 引用[1]提到,如果你已经有一个DLL文件(但没有对应的导入),可以使用MinGW工具生成`.a`导入。但本问题中我们直接生成DLL和对应的导入。 **关于CMake**: 引用[3]和[4]提到,可以使用CMake配置项目生成Makefile,然后使用MinGW进行编译。这适用于大型项目。在CMake中指定MinGW编译器路径(gcc.exe和g++.exe),并设置生成DLL的相关选项。 **示例(CMake生成DLL)**: 在CMakeLists.txt中,添加: ```cmake add_library(mydll SHARED mydll.c) ``` 然后使用CMake生成MinGW Makefile,再执行`mingw32-make`即可。 总结:使用MinGW生成DLL主要有两种方式:直接使用gcc命令行,或通过CMake等构建工具生成。 §§相关问题§§ 1. 如何用MinGW生成64位DLL? 2. 如何编写一个导出了C++类的DLL? 3. 如何用CMake配置一个生成DLL的项目? 4. MinGW生成DLL与MSVC生成DLL有什么区别?</think>### 如何使用 MinGW 生成 DLL 文件 #### 核心步骤 1. **安装 MinGW 工具链** - 确保已安装 MinGW 并配置环境变量(PATH 包含 `gcc.exe` 和 `g++.exe` 所在目录) - 验证安装:`gcc --version` 2. **编写源代码** ```c // mydll.c __declspec(dllexport) void hello() { printf("Hello from DLL!\n"); } ``` 3. **编译生成 DLL** ```bash gcc -shared -o mydll.dll mydll.c -Wl,--out-implib,libmydll.a ``` - `-shared`:生成共享DLL) - `-Wl,--out-implib`:同时生成导入(`.a`文件) #### 关键参数说明 | 参数 | 作用 | |------|------| | `-shared` | 生成动态链接 | | `-o` | 指定输出文件名 | | `-Wl,--out-implib` | 生成导入(供其他程序链接) | | `-I` | 指定头文件路径 | | `-L` | 指定文件路径 | #### 注意事项 1. **32/64 位兼容性**(引用[2]) - MinGW 默认生成 32 位 DLL - 生成 64 位 DLL 需使用 **MinGW-w64** 工具链 - 兼容性建议: - 32位DLL:使用 MinGW - 64位DLL:使用 MSVC 或 MinGW-w64 2. **CMake 集成**(引用[3][4]) 在 CMakeLists.txt 中配置: ```cmake set(CMAKE_C_COMPILER "D:/Qt/Tools/mingw730_32/bin/gcc.exe") set(CMAKE_CXX_COMPILER "D:/Qt/Tools/mingw730_32/bin/g++.exe") add_library(mydll SHARED mydll.c) ``` 3. **导入生成**(引用[1]) - 若已有 DLL生成 `.a` 导入: ```bash dlltool --dllname mydll.dll --def mydll.def --output-lib libmydll.a ``` #### 验证 DLL 1. 使用 `objdump` 检查导出函数: ```bash objdump -p mydll.dll | grep "Export" ``` 2. 创建测试程序调用 DLL 函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值