共用庫Side-by-Side之Windows Shared Assembly

來源:互聯網
上載者:User

最近在設計一個編譯系統的依賴管理部分,如果一個project的dependency closure(所有直接和間接的依賴)中有某個相同的library的不同版本,我們就認為這裡有一個版本衝突, 那麼在檢測到版本衝突的時候,是報一個warning讓警告使用者,還是報一個錯誤直接退出,要求使用者先解決版本衝突呢? 事實上,無論在windows上,還是在linux中,我們都有相應的機制來保證不同版本的library是可以在同一個程式中工作的,在windows上是side-by-side assembly,通過manifest和activation context實現,而在linux下則是通過設定RPATH。 所以我們編譯系統的行為應該是報一個warning,讓使用者判斷這個版本衝突究竟是個問題,還是可以接受的,並提供機制讓使用者抑制這種warning - 然後,針對不同平台產生side-by-side的library。

對於底層side-by-side如何?,這裡有三個方面:

  • Windows下shared assembly: 對於用VC++ build的,有CRT, ATL, MFC以及OpenMP,這些library是與compiler對應的,所以用不同版本的VC++編譯時間會插入不同的manifest來表明依賴的library到底是哪裡來的。這個使用者基本不用做什麼工作。
  • Windows下private assembly:使用者自己的library,想要side-by-side,這個需要使用者提供相應的manifest,並且library必須放置在application的子目錄下面,Microsoft提供了文檔
  • Linux下RPath,binary中有一個section讓設定RPATH,需找library的時候,會從該path找。

這裡是第一個例子,Windows下shared assembly:源碼地址

foo是一個DLL, 用vs2008編譯,依賴於vscrt90,bar是一個exe,用vs2010編譯,自然依賴於vscrt100, 另外它還依賴foo。項目都用premake描述,產生visual studio檔案後用msbuild編譯。

編譯步驟如下:

1. build foo
* cd foo
* premake4 vs2008
* "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
* msbuild foo.sln

2. build bar
* cd bar
* premake4 vs2010
* "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
* msbuild bar.sln

3. Copy foo.dll to bar/

 

運行bar.exe, 然後開啟procexp查看該進程:

我們可以看到, vscrt90和vscrt100的library同時被載入到同一進程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.