2010-03-18 147 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