2015-11-03 218 views
1

我在C++中有多個可執行程序,它們使用C++編寫的許多庫(我擁有所有這些庫的源代碼)。避免DLL版本問題

我面臨的問題是:當一個可執行的EXE包括DLL DLL他們可能都依賴於其他DLL DLL1和DLL2:

EXE ----- DLL 
|   | 
DLL1  DLL2 

如果DLL1和DLL2是相同的庫和DLL 2是DLL1的更新版本,我會遇到麻煩鏈接和編譯的東西。

我該如何解決這個問題?有時候,我不能只是轉儲DLL1,並保持最新的由於向後兼容性問題。

+1

個人而言,我的建議是避免整個混亂,只是重新編譯您的程序到獨立的可執行文件。是的,他們會佔用更多的磁盤空間,但這些日子,誰在乎? –

+0

鑑於你擁有所有東西的來源 - 而不是我下面的複雜答案 - 務實的解決方案是重建包括版本號的dll。然後exe會導入並使用「dll.1.0.dll,並且dll會導入並使用'dll.2.0.dll',並且每個人都可以存在於一個文件夾中。 –

回答

2

微軟爲Windows XP解決了這個問題,但幾乎隱藏了關於如何從「本地」開發者那裏獲得的信息。

有點嚇人的MSDN頁面Building C/C++ Isolated Applications and Side-by-side Assemblies是跳轉點。

基本上你需要做的是:

  1. 轉換DLL1和DLL2到組件。程序集是一個dll文件+擁有它的清單。稱他們爲dll1.manifest和dll2.manifest(也許)。

  2. 將manifestdependency *指令添加到EXE和DLL中,並按名稱列出上述每個程序集。

  3. 爲每個程序集創建子文件夾「dll1」和「dll2」,並在其中存儲隱含命名的dll。

注意:「DLL」和「EXE」不,他們自己需要是組件雖然文檔可能推斷/鼓勵。


關於步驟2 - 它是不需要手動添加或合併清單文件的EXE或DLL,如Visual Studio中的現代版本自動包括與應用程序生成的清單。有一個完整的項目設置選項卡專用於此。

要掛鉤到此DevStudio #pragma用於註冊要包含在生成的清單中的程序集。這是應用程序(或dll)如何聲明使用版本化的comctl32.dll的興趣的例子 - 爲了您的目的,您可以更改名稱以反映您的「dll」程序集名稱,而且您不需要版本或publicKeyToken參數爲您的應用程序隨附的程序集。

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")