簡體   English   中英

C ++ DLL向后兼容NO CLR

[英]C++ DLL backward compatibility with NO CLR

我已經看過SF的以下兩個鏈接,但它們對我沒有幫助:

https://stackoverflow.com/questions/21591649/c-dll-providing-backward-and-forward-compatibility-for-callers

.lib和.dll向后兼容性

我有一個C ++項目,它不基於CLR。 輸出是一個DLL文件。 現在,我在Windows 8上並使用Visual Studio 2013生成項目。 輸出DLL在Windows 8上可以正常工作。但是,當我將相同的輸出DLL放在窗口7中時,出現諸如“缺少DLL MSVCR120.DLL”之類的錯誤,我嘗試將缺少的DLL復制到Windows 7中的System32文件夾中,並且出現DLL丟失錯誤離開,但我的DLL仍然無法正常工作。 只有當我在Windows 7的Visual Studio 2010中構建源代碼,然后使用其輸出DLL時,它才能正常工作。 在Windows 7上,安裝了C ++可重新分發的運行時2010。 我還嘗試安裝其他版本的C ++運行時,但在Win 7上沒有成功。

我是否可以僅使用一台開發機和一個Visual Studio來創建一個(甚至多個)C ++ DLL,該DLL在大多數Windows版本(例如Vista,7、8,Server 2008等)中都可以工作? 現在,我必須使用自己的VS在每個不同的OS上構建源代碼。

PS:該項目是Windows憑據提供程序實現。

可能由於某些原因事情無法按預期進行

  1. 您的項目目標可能是Windows 8,請參見“ 使用Windows標頭” 基本上,如果該dll是為Windows 8編譯的,則Windows 8的某些新功能將被解鎖,但這意味着不支持Windows的早期版本。
  2. C ++ Dlls在所有編譯器之間都不兼容ABI,因此,取決於DLL的實現方式以及編譯器的不同之處,它可能會起作用,也可能不會起作用。 我的意思是,當使用DLL的應用程序在VC 2010中編譯,而DLL在VC2013中編譯時,VS2010應用程序可能無法加載VC2010 dll。 請參見HowTo:從DLL導出C ++類,或者您可以執行完整的COM dll。
  3. 您的Dll依賴於其他不存在的DLL,或者不存在正確的版本(即,您使用的DLL中添加了新功能,但系統上DLL的版本不包含該功能)。 在遇到問題的計算機上使用Dependency Walker打開DLL,以顯示丟失的DLL。
  4. 與第3點相關。在不加載DLL的系統上安裝vcredist 2013,如果DLL是64位,則需要64位vcredist,或者如果DLL是32位,則需要32位vcredist。
  5. 64位應用程序無法加載32位dll,反之亦然。

我沒有足夠的聲譽來發布兩個以上的鏈接,所以搜索Dependency Walker

通常,您需要在使用DLL的所有計算機上安裝VS2013可再發行組件

一種替代方法是構建您的項目以與靜態運行時庫鏈接,但是生成的可執行文件將更大。 這樣的答案中有更多細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM