2012-10-09 39 views
0

我有問題,我完全傻眼了,我正在跳一個人可以指向正確的方向。C++ DLL 靜態庫名稱問題

我有在鏈接的靜態庫DLL在DLL我有以下簽名和開頭的函數:

CellMatrix BasisSwapFlows(double spread, const std::string & convention, int startDate, int endDate, bool forceEOM, const CellMatrix & returnSide, bool explode) 
    CashFlow::Vector flows(basisSwapFlows(spread, getBasisSwapConvention(convention), XLDate(startDate), XLDate(endDate), forceEOM)); 
    .... 

在那裏,我打電話從靜態庫中的函數與簽名:

CashFlow::Vector basisSwapFlows(double spread, const BasisSwapConvention & convention, const XLDate & startDate, const XLDate & endDate, bool forceEOM) 

當我編譯和調用靜態庫過程中釋放模式運行這個話,第一個參數(傳播)似乎有uninitilized。但是,在呼叫站點(在DLL中)顯然是這樣。這在調試模式下不會發生。另外,如果在調用靜態庫之前,我做的說法即副本:

double spread_loc(spread); 
CashFlow::Vector flows(basisSwapFlows(spread_loc, getBasisSwapConvention(convention), XLDate(startDate), XLDate(endDate), forceEOM)); 
    .... 

和傳遞,不會出現問題。最後,如果我修改靜態lib函數的名稱來說出basisSwapFlows_v2,問題就會消失。但是,重新排序參數什麼也不做。

我正在使用VS2010 C++編譯器。請讓我知道,如果有任何其他信息,我可以提供。

編輯:我還發現,當我在兩個庫中的發佈版本中關閉優化時,此問題消失。事實上,只是禁用DLL中的優化會導致問題消失。編輯2:同樣發現只關閉整個程序優化但將每個Full Optimization項目都解決了問題。

編輯3:保留所有優化,但通過const ref參數也解決了問題。

+0

我和Stas一起工作。我經歷了所有的優化選項,所有需要關閉的才能正常工作的是全程序優化。每個其他優化可以留在原地。 – Hazerider

回答

1

這很好可能是使用不同版本的stl的問題。在使用運行時C++庫時,在客戶端和鏈接庫中使用具有相同選項的相同編譯器至關重要。是否有可能您使用發佈版本的客戶端或簽證版本調用庫的調試版本

+0

我不這麼認爲。我的印象是,在這種情況下你會得到一個迭代器調試級別不匹配錯誤。另外,我正在建立自己的圖書館。這不是第三方軟件。 – stas

0

DLL和靜態庫必須在相同的條件下編譯,即內存對齊(字節,字,長),調用conentions(這可能是滿意的)和相同的類型長度(例如int可能需要一個編譯器/開關4個字節和另一個2字節)。

+0

我是建立兩個庫的人,我沒有改變編譯器條件(不是那些)。 – stas