使用code::blocks编译windows的dll链接库

Posted glensblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用code::blocks编译windows的dll链接库相关的知识,希望对你有一定的参考价值。

因为机子上没有安装Visual Studio,所以找到了一种通过code::blocks编译dll的方式,踩到的坑是code::blocks默认的compiler是32位的,这样编译出的dll也是32位的,编译64位的需要借助MinGW-w64的toolchain。

为code::blocks配置外部MinGW-w64编译器可以参考Compile 64-bit under windows with MinGW-w64

使用code::blocks创建一个dll的工程,如下图:

技术图片

go和next到下一步:

技术图片

选择我们上面配置的编译器:

技术图片

Finsh完成,此时已经建好main.h和main.cpp文件,这里我实现了一个add函数的dll库,代码如下:

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */

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


#ifdef __cplusplus
extern "C"
{
#endif

int DLL_EXPORT add(int a, int b);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp

// a sample exported function

int DLL_EXPORT add(int a, int b)
{
    return a + b;
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

build之后就可以生成我们想要的dll库。这里刚开始没发现compiler位数问题,编译出的是32位的dll,在x86_64平台上用会报错,通过使用Cygwin命令行仿真工具的file命令可以查看dll的位数,这个是比较简单的判断dll位数的方式。

 这里在安装MingGW-w64 toolchain时也遇到一个问题,就是使用上述链接提供的MinGW下载链接下载的mingw-w64-installer.exe安装时会报"cannot download repository.list"的错误,所以又找了下发现这个错误还挺多人碰到过,官方没有修复而是给出编译好的版本,可以在这里下载,下载完解压出来就可以使用了。

以上是关于使用code::blocks编译windows的dll链接库的主要内容,如果未能解决你的问题,请参考以下文章

在Code::Blocks中编译和使用wxWidgets3.0.0教程

Code::Blocks编译不了C++,要怎么样设置编译器?

如何直接编译最初用 code::blocks 编写的代码

code::blocks 如何打断点

如何在 code::blocks 中使用 graphics.h 编译和运行程序?

如何使用带有 Code::Blocks 的 OpenCV 2.4.3 编译程序?