C++ 编译 DLL 动态链接库

2021-07-22  本文已影响0人  ansey

C++ 编译 DLL ,有托管、非托管 两种模式,这里只讨论非托管。

环境:

系统:windows 10
编译器:Mingw-w64 ver8.1.0

安装 Mingw-w64

下载链接

检查是否安装成功,命令行窗口输入

gcc -v

查看是否有版本信息打印。

编译DLL

C 的方式编译 , 动态库函数名不会被修改
新建头文件 cpp2DllStyleC.h


#define BUILD_DLL

// extern "C" , 按 C 的方式编译 
// C 的方式编译 , 动态库函数名不会被修改

#ifdef BUILD_DLL
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C" __declspec(dllimport)
#endif

//测试函数
EXPORT double add_gcc_c(double a, double b);

新建文件 cpp2DllStyleC.cpp


#include "cpp2DllStyleC.h"

//测试函数的实现
double add_gcc_c(double a, double b)
{
    return a + b;
}

//没有 mian 函数, gcc 编译会失败。
int main()
{
    return 0;
}


命令行窗口 编译

gcc -shared -o cpp2DllStyleC.dll cpp2DllStyleC.cpp

编译后,cpp2DllStyleC.dll 文件会在同一目录。

新建头文件 cpp2DllStyleCPP.h

#define BUILD_DLL
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

#pragma once
namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // 测试函数
        static EXPORT double add_gcc_cpp(double a, double b);
    };
}

新建文件 cpp2DllStyleCPP.cpp

#include "cpp2DllStyleCPP.h"

namespace MathFuncs
{
    //测试函数的实现
    double MyMathFuncs::add_gcc_cpp(double a, double b)
    {
        return a + b;
    }
}

int main()
{
    return 0;
}

命令行窗口 编译

gcc -shared -o cpp2DllStyleCPP.dll cpp2DllStyleCPP.cpp

查看DLL 输出

dumpbin 工具

上一篇下一篇

猜你喜欢

热点阅读