如何使用MinGW将符号正确导出到Windows DLL中?

时间:2017-08-01 18:32:47

标签: c++ dll mingw

我正在尝试使用MinGW创建一个具有一个公开函数的C ++库。

我想我已经阅读了足够tutorials,环顾互联网,但似乎没有任何效果,错误总是一样的。未定义的函数引用。

这是库的标题(findPoints.h):

#ifndef FIND_POINTS_H
#define FIND_POINTS_H

#ifdef BUILDING_FIND_POINTS_DLL
#define FIND_POINTS_DLL_PREFIX __declspec(dllexport)
#else
#define FIND_POINTS_DLL_PREFIX __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

FIND_POINTS_DLL_PREFIX void findPoints(uint8_t* data, int height, int width, int* cx, int* cy, int* lx, int* ly, int* rx, int* ry, int* quality);

#ifdef __cplusplus
}
#endif

#endif 

这是源文件(findPoints.h)中的函数声明:

#include "findPoints.h" 

//...

void FIND_POINTS_DLL_PREFIX findPoints(uint8_t* data, int height, int width, int* cx, int* cy, int* lx, int* ly, int* rx, int* ry, int* quality) {
    std::thread worker(findDroplet, data, height, width, cx, cy, lx, ly, rx, ry, quality);
    worker.detach();
}

该文件长约1000行(所有这些都是findDroplet声明的一部分,仅取决于标准库),所以我省略了它,但错误似乎并不存在。

要验证它是否正确,我将其包含在main.cpp文件中。虽然它在我使用时编译:

gcc main.cpp findPoints.cpp -o findPoints.exe

我无法创建一个可用的dll(我需要一个dll)。这就是我的工作:

g++ -c -O3 -DBUILDING_FIND_POINTS_DLL findPoints.cpp 
g++ -c main.cpp
g++ -shared -o findPoints.dll -Wl,--out-implib,libfindPoints.a
g++ -o findPoints.exe main.o -L. -lfindPoints

失败并显示错误消息:

main.o:main.cpp:(.text+0x1d5): undefined reference to `_imp__findPoints'

我尝试了各种前缀的排列,但似乎没有任何效果。总是找不到findPoins,取决于它可以有一些前缀或后缀的前缀,但它永远不会存在。我尝试了dlltool,但它根本没有列出该功能。

看起来如果cpp文件中的findPoints函数被完全忽略,如果我更改其名称,错误消息将保持不变。它们具有相同的签名,因为否则将它们编译在一起是行不通的。

编辑:更多研究:我设法创建了一个dll库和一个使用Visual Studio使用它的exe程序。它工作(如果dll不存在则崩溃)。但是如果我尝试使用MingGW编译程序并将dll链接到它,则错误保持不变。问题现在已经解决,但代价是繁重的解决方法。不过,我想知道答案,因为我不喜欢Visual Studio。

1 个答案:

答案 0 :(得分:2)

创建DLL时,您没有将任何对象传递给g++

替换

g++ -shared -o findPoints.dll -Wl,--out-implib,libfindPoints.a

g++ -shared -o findPoints.dll findPoints.o -Wl,--out-implib,libfindPoints.a

在您的构建序列中。