解決 Boost 在 VC14 CTP6 無法建置的問題


恩…這是一個困擾 Heresy 很久的問題了…Heresy 之前為了嘗鮮,已經把 VisualStudio 安裝到最新的 VisualStudio 2015 預覽版了。而本來基本上都相安無事,但是後來在更新到 CTP6(官方介紹)之後,問題就來了…

但是應該是因為 VisualStudio 2015 CTP6 在 VC 的部分(以下稱「VC14 CTP6」),引進了新的「Universal CRT」(官方介紹)的關係,結果 Heresy 的 Boost C++ Libraries 就這樣無法建置成功了… orz

遇到的錯誤,基本上會像是:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\crtdefs.h(10):
fatal error C1083: Cannot open include file: 'corecrt.h': No such file or directory

從錯誤訊息來看,應該是在編譯 Boost 的程式的時候,找不到必要的 header 檔、「corecrt.h」的關係;而這個問題,應該是由於 Universal CRT 在 CRT 的路徑上做了一些調整所導致的。

這個問題並不是只有 Heresy 碰到,網路上也可以看到其他人有遇到相同的問題,但是也沒有找到解法(參考)。

Heresy 一開始以為這應該是 Boost.Build 的腳本沒有針對 VC14 CTP6 做調整,本來還很認真地想去研究他的腳本檔的,但是後來花了兩天,還是放棄了…因為 Heresy 根本搞不清楚他的架構…

後來又一直在網路上找了很久,也都沒有找到解法、甚至連相關討論都不多,這更讓 Heresy 在想到底為什麼會這樣了。

不過昨天,謎底終於揭曉了!在 4/2、Boost 的開發者討論區有一篇名為《[boost] [VS++ 2015 CTP 6] [build] Workaround for Visual Studio 2015 CTP 6 Preview breaking Boost.Build》的文章,終於解決了 Heresy 的問題。以下就是這篇文章的內容:

If you have previously been running Boost.Build on toolset=msvc-14.0

(Visual Studio 2015 Preview), installing CTP 6 causes some bjam/b2 builds

to fail because of missing include files.

What’s happening is that Boost.Build caches several files in

C:\Users\<name>\AppData\Local\Temp. For my installation these files are:

     b2_msvc_14.0_vcvarsall_x86.cmd

     b2_msvc_14.0_vcvarsall_x86_amd64.cmd

     b2_msvc_14.0_vcvarsall_x86_arm.cmd

but the introduction of the new universal runtime stuff in CTP 6 added some

additional paths to vcvarsall, so the cached files are no longer correct.

The workaround is to simply delete the b2_msvc_14.0_vcvarsall* temporary

files. The next time bjam/b2 is run correct versions of the files will be

regenerated.

–Beman

基本上,重點就是,這個問題並不是 Boost.Build 需要修改!而是因為 Boost.Build 會去產生相關路徑的批次檔做快取,而如果在安裝 CTP6 之前有建立這些快取檔的話,在安裝 CTP6 後就會因為沒有更新新的路徑,所以導致找不到必要的檔案!而解決方法,就是要去把他產生的快取檔案刪除!也就是說,Heresy 之前完全搞錯努力的方向了… orz

而這些快取檔案,基本上會在「C:\Users\<username>\AppData\Local\Temp」這個路徑下(其中的「<username>」是要自己更改的,或是建議可以使用「%LOCALAPPDATA%/temp」這個路徑),檔名應該會是「b2_msvc_14.0_vcvarsall」開頭的 cmd 檔;理論上只要把這幾個檔案刪除,再重新執行 Boost.Build(b2)就可以了。

結論:就為了這幾個快取檔案,讓 Heresy 的開發環境好久不能動… orz


另外,雖然這樣可以成功地建置 Boost 了,但是在實際使用時,Boost.Log 這個函式庫還是有點問題,需要手動修改。

問題的狀況是,在連結程式的時候,會出現找不到「__vcrt_getptd」這個符號的錯誤。這個問題已經有被提出來、並且修正了(參考),但是 Boost 1.57.0 這個版本並沒有被完整地修正,所以還是有問題,需要自己修正才行。

修正的方法可以參考 GitHub 上的這個 patch;基本上只要按照修改紀錄、修改 Boost 目錄下這三個檔案就可以了。

  • \boost\log\detail\code_conversion.hpp
  • \libs\log\src\code_conversion.cpp
  • \libs\log\src\unhandled_exception_count.cpp

對「解決 Boost 在 VC14 CTP6 無法建置的問題」的想法

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.