2017-08-01 39 views
5

我想创建一个C++库,它有一个使用MinGW的公开函数。如何使用MinGW将符号正确导出到Windows DLL中?

我想我已经读够了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线long(全部都是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

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

更换

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

g++ -shared -o findPoints.dll findPoints.o -Wl,--out-implib,libfindPoints.a 
在构建序列

+0

感谢您的回复,但我现在试图最终创建一个动态链接的程序时,我得到了'版本符号'__cxa_finalize @@ GLIBC_2.2.5''没有符号版本部分。请注意,我必须添加'-fPIC'来编译参数。 – Dugi

+0

您是否试图链接针对不同版本的GNU C库编译的附加库? – t0m

+0

这就是我所怀疑的。我删除了除源代码之外的所有内容,重新编译它,错误仍然存​​在。自从发布这个问题以来,我已经改变了一些东西,包括glibc的版本,但是我不知道在移除除源代码之外的所有内容之后它如何起作用。我的glibc s 2.24版本。 – Dugi

相关问题