2012-09-13 45 views
0

編譯器崩潰在* .cpp文件,試圖用一個第三方的lib:__declspec(dllimport的)導致的MSVC 2010

#define DLL_IMPORT 
#include <thirdParty.h> 
// Third party header has code like: 
// #ifdef DLL_IMPORT 
// #define DLL_DECL __declspec(dllimport) 

// fatal error C1001: An internal error has occurred in the compiler. 

備選:

#define NO_DLL 
#include <thirdParty.h> 
// Third party header has code like: 
// #elif defined(NO_DLL) 
// #define DLL_DECL 


// Compiles fine, but linker errors as can't find DLL functions 

我可以重現通過刪除結果宏和#定義在一起,並手動編輯第三方文件以具有__declspec(dllimport)或不 - 因此上述預處理器的東西只是爲了顯示發生了什麼,它不是複製粘貼。

有沒有人碰到類似的話,也可以在事業暗示? (這是使用CMake創建的)。上面是2行* .cpp的實際例子,它崩潰了,所以它被縮小到#include中的某個東西。

下也很好地工作:

  1. 編譯由第三方(他們提供了一個*的.sln)使用dllimport的/出口提供的例子,因此不會顯得庫的故障
  2. 編譯第三方的lib作爲生產項目的一部分(以便DLLEXPORT正常工作)

我搜羅了兩個項目的項目設置頁面,試圖找出差異,但都拿出了空白。當然,這可能是我錯過了一些東西,因爲這些設置頁面並不是最容易瀏覽的。我將在一天左右訪問VS2008,因此可以與此進行比較。第三方庫是MySql ++。

+0

您是指鏈接器崩潰,或者鏈接器報告錯誤LNKxxxx? – Ajay

回答

1

編譯器崩潰絕對是編譯器中的一個錯誤,因此您最好將錯誤報告提交給Microsoft Visual C++團隊。

至於錯誤

#define DLL_DECL __declspec(dllimport) 

是錯誤的方式去了解的東西。應該設置一些需要設置的項目設置,如果是DLL_DECL,則可以定義一個預處理指令,或者僅包含一個不同的文件。

+0

我受到第三方的約束,但你是對的 - 它有一個我設置的宏,導致#define DLL_DECL成爲包含文件的第一行。爲了清楚起見,我在示例中將其拉出來了 - 實際上有一大堆設置,但是我可以在第三方頭文件中手動鍵入__declspec部分以重現結果,因此我非常確信這是根本問題。 – Zero

+0

@零,只會讓人困惑。這就是你應該使用的宏,'DLL_DECL'似乎是庫的內部,你不應該改變它。 –

+0

公平點 - 爲了清晰我編輯過,希望現在好點。 – Zero

0

原來這是因爲預編譯的頭已開啓該項目試圖利用DLL。

相關問題