2008-09-08 49 views
4

將使用VS 2005編譯的靜態庫(.lib)與使用VS 2008編譯的程序鏈接是否正確?庫和我的程序都是用C++編寫的。該程序在Windows Mobile 6 Professional模擬器上運行。VS 2005&2008鏈接庫

這似乎工作,沒有鏈接錯誤。然而,程序在啓動過程中會崩潰,因爲奇怪的事發生在鏈接庫中。例如。 lib可以返回大負數的字符向量。

當程序被編譯與VS 2005

什麼是更奇怪的使用發佈配置生成,只有當這個問題是有沒有這樣的問題。使用調試配置進行編譯時,問題不會發生。

回答

11

VS2005和VS2008使用不同的STL實現。當VS2005代碼返回一個向量時,該對象的內存佈局與VS2008所期望的不同。這應該是您在返回日期中看到的損壞值的原因。作爲一個經驗法則,您應該始終使用相同的編譯器編譯項目的所有C++模塊,並且所有設置/#定義相同。

導致類似行爲的一個特定#define是VS2008的SECURE_SCL #define。使用不同設置編譯的兩個模塊會創建您的問題,因爲#定義SECURE_SCL爲各種C++庫類引入更多成員變量。

2

按照您描述的方式鏈接到較舊的庫是不正確的,但是您不會感到驚訝,您會看到一些奇怪的行爲。夫婦完整性檢查:

  • 是否使用相同版本的相同的運行時庫這兩個文件?
  • 您的.EXE應用程序是否「看到」.LIB所針對的相同頭文件?確保_WIN32_WINNT(等)宏是declared properly

當你說.LIB,你的意思是一個真正的靜態庫(mylib.lib)或DLL的導入庫(mylib.lib - > mylib.dll)?

什麼是您的VS2008可執行項目的編譯/鏈接設置?