2010-03-18 112 views
27

我试图将LizardTech GeoExpress DSDK链接到我自己的应用程序中。我使用gcc,以便我们可以在平台上进行编译。在Linux和Mac上,这很容易实现:它们提供了一个静态库(libltidsdk.a)和头文件,我们所要做的就是使用它们。从MinGW链接到MSVC DLL

编译窗口并不那么容易。他们使用Microsoft Visual Studio构建了这个库,我们使用MinGW。我已阅读MinGW常见问题解答,并且遇到以下问题。库是所有C++,所以我的第一个问题:这甚至可能吗?

仅仅根据提供的dll链接,会产生所有C++调用(构造函数,析构函数,方法等)的“未定义引用”错误。

基于MinGW的维基: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs 我应该能够使用该实用程序reimp到的.lib转换成可用的东西。我试过所有由LizardTech提供的.lib文件,它们都给“无效或损坏的导入库”。我已经尝试了0.4版和0.3版的reimp工具。

使用维基中描述的第二种方法,我已经运行pexport和dlltool在dll上以获取.a档案,但是这会产生相同的未定义引用。

BTW:我已阅读下面的讨论。它留下了一些含糊不清的情况,这是否可能,并给了MinGW Wiki页面,似乎这应该是可行的。如果不可能,那就是我需要知道的。如果可以做到,我想知道我该如何解决这个问题。

How to link to VS2008 generated .libs from g++

谢谢!

回答

22

你不能这样做。他们已经从他们的dll导出了C++类,而不是C函数。不同之处在于,C++函数始终以特定于编译器特定版本的特定格式的名称导出。

他们的DLL是MSVC仅可使用以这种形式,并且可能不会甚至不同版本的MSVC之间工作,因为微软之前已经改变了他们的重整方案。

如果你有任何杠杆作用,你需要让他们改变他们的邪恶方式。否则,你将需要使用MSVC写一个垫片的DLL,这将导入所有的课程,并通过C函数返回的接口再出口。

+1

谢谢,这正是我正在寻找的确认。他们有一个c接口,我正在使用它,但它比C++中的可用性要低得多。我也推动他们发布MinGW。 – IndigoFire 2010-03-18 21:15:21

+5

我更喜欢所有mingw发行版,因为它使得部署非常简单,当c-runtime依赖是通用的msvcrt.dll,而不是visual studio版本特定的运行时msvcr70.dll,msvcr71.dll,msvcr80。 DLL,msvcr90.dll和现在msvcr100.dll。 – 2010-10-16 08:33:17

3

我是差不多确定您不能在这样的编译器之间链接C++库。我尝试过,很努力,但很久以前,我不记得细节。我认为对于C库是可能的,有很多黑客。

0

要在Windows中使用DLL,您需要链接到导入库(而不是DLL本身)。导入库通常具有扩展名.lib(就像静态库一样)。如果您下载Windows SDK,您将获得所有系统DLL的导入库。

从你的问题,这听起来像你可能混淆了.DLL的.DLL。你确定reimp不会将DLL作为输入,并创建一个与MinGW兼容的.LIB导入库吗?

我只是用维基百科查找MinGW。根据那篇文章,MinGW带有可再发行的导入库。

+1

基于MinGW wiki,reimp需要一个导入库。运行它对DLL也不起作用,尽管我尝试过。 – IndigoFire 2010-03-18 20:06:20