我正在尝试使用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。
答案 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
在您的构建序列中。