Ubuntu 16 遇到的 g++ 5.x ABI 不相容問題

Heresy 目前開發跨平台的 C++ 程式的時候,主要是透過 Windows 10 的「Bash on Ubuntu on Windows」這個 Windows Subsystem for Linux(WSL)來進行操作的。

在微軟剛貼出的時候,他的 Ubunutu 版本還是 14,而後來在微軟推出 Creators Update (1703) 的時候,也把 Ubuntu 的版本升級到 16.04 了~而在 Ubuntu 系統版本升級的同時,系統預設使用的編譯器也由 g++ 4.x 更新到 g++ 5.x 了。

而也因為這樣,當 Heresy 要做 Linux 環境的建置測試的時候,也碰到了一些問題,這邊就稍微紀錄一下了。

首先,會有問題的主要原因,是 GCC5.1 在發布的同時,也推出了新的 libstdc++;而這個 C++ 的標準函式庫為了符合 C++11 的標準,重新實作了 std::stringstd::list;而這兩個類別由於遵循了新的規範(禁止 Copy-On-Write),所以變得和舊版的函式庫不相容。

為了避免混亂,gcc 5.1 修改了對應的 ABI(Application binary interface),像是 std::list<int> 實際上會是定義成 std::__cxx11::list<int> 的形式;基本上,就是有部分標準函式庫的東西的 namespace 會從 std 變成 std::__cxx11 了。

閱讀全文

廣告

Bash on Ubuntu on Windows 的簡單使用

前一陣子,Heresy 有寫了一篇《Windows 10 將可以跑 Linux 的 Bash shell 和 Ubuntu 的程式了》來介紹微軟即將在新版 Windows 10 內做的一個往 Linux 方向靠攏的功能了~

而雖然這項功能應該是要等到夏天的 Windows 10 年度更新才會有,不過目前在 Windows 10 Insider Preview 的 Fast Ring 最新的預覽版、Build 14316 裡面(官方介紹),就可以搶先體驗這個功能了!Heresy 看到之後,就立刻把筆記電腦切到 Insider Preview 了、準備試玩了~ XD

不過很遺憾的是,在把 Windows 10 從正式版切換到 Insider Preview 後,並沒有辦法馬上偵測到預覽版的更新…Heresy 甚至去下載了比較舊的預覽版 ISO、透過 ISO 強制更新到 Insider Preview 的版本,Windows Update 還是沒辦法偵測到更新… orz
後來是電腦又放了幾天,他才能抓到 Build 14316、並開始更新。總覺得,微軟這方面做的還真糟糕啊…

閱讀全文

Windows 10 將可以跑 Linux 的 Bash shell 和 Ubuntu 的程式了

這應該是今年微軟 Build 大會,最讓人震驚的消息了吧?有興趣的人,可以參考《Developers can run Bash Shell and user-mode Ubuntu Linux binaries on Windows 10》一文。

基本上,這項功能預計會在 Windows 10 的年度更新(Anniversary update、預計是今年夏天發布)的時候出現,他會在 Windows 10 中建立一個 Ubuntu 的 Linux 子系統;而之後就可以直接在 Windows 10 的環境下,執行 Ubuntu 的 bash shell 了!

而更重要的是,他會有一個完整的「Ubuntu user space」,Ubuntu 上的 user-mode 的應用程式,也將可以直接在這個環境下運作!甚至,不需要重新編譯過,只需要直接在這個環境中,使用 apt 這個套件管理工具,來下載各式各樣的應用~

閱讀全文