Problem

Visual Studio Codeは素晴らしい開発環境です。
Windows/Mac/Linuxで動作するマルチプラットフォーム対応が売りですが、Linuxはディストリビューションが多すぎて、コアの部分の挙動が異なります。
原因として、システムに使われているモジュールの依存関係が牙をむきます。
自分は、Visual Studio Codeの言語拡張機能である、**C/C++**を使っていました。

Microsoft謹製のツールで信頼がおける、と思っていました。

しかし、Redhat Enterprise Linux 7では、この拡張は動きませんでした。
拡張機能である、CMake Tools経由でビルドしてみました。

CMakeTools extension was unable to initialize: [cmake-server] Failed to activate protocol version: “generator” is unset but required.

というエラーを吐いて、ビルドが停止します。

Why?

一見、CMakeToolsが悪いように思えます。
未確認ですが、CMakeToolsはServerModeで動作しているCMakeを経由して言語拡張にビルドを要求している?

ともかくとして、調べてみると、どうもGLibcのバージョンに問題があるようです。
CentOS7、RHEL7のGLibcは2.17がデフォルトでインストールされています。

1
2
3
4
5
6
7
8
9
10
11
$ yum list installed | grep glibc
Repo rhel-server-rhscl-7-rpms forced skip_if_unavailable=True due to: /etc/pki/entitlement/4481450522517738742-key.pem
Repo rhel-7-server-dotnet-rpms forced skip_if_unavailable=True due to: /etc/pki/entitlement/4481450522517738742-key.pem
Repo rhel-7-server-rpms forced skip_if_unavailable=True due to: /etc/pki/entitlement/4481450522517738742-key.pem
Repo rhel-7-server-rt-rpms forced skip_if_unavailable=True due to: /etc/pki/entitlement/4481450522517738742-key.pem
glibc.i686 2.17-196.el7 @rhel-7-server-rpms
glibc.x86_64 2.17-196.el7 @rhel-7-server-rpms
glibc-common.x86_64 2.17-196.el7 @rhel-7-server-rpms
glibc-devel.i686 2.17-196.el7 @rhel-7-server-rpms
glibc-devel.x86_64 2.17-196.el7 @rhel-7-server-rpms
glibc-headers.x86_64 2.17-196.el7 @rhel-7-server-rpms

ところが、C/C++言語拡張は2.18を要求します。

1
2
3
4
5
6
7
8
9
10
$ ldd /home/xxxxxx/.vscode/extensions/ms-vscode.cpptools-0.12.2/bin/Microsoft.VSCode.CPP.Extension.linux
/home/xxxxxx/.vscode/extensions/ms-vscode.cpptools-0.12.2/bin/Microsoft.VSCode.CPP.Extension.linux: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /home/xxxxxx/.vscode/extensions/ms-vscode.cpptools-0.12.2/bin/Microsoft.VSCode.CPP.Extension.linux)
linux-vdso.so.1 => (0x00007ffe613a7000)
libm.so.6 => /lib64/libm.so.6 (0x00007fb11b780000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb11b564000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb11b1a0000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb11af9c000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb11ad94000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb11ab7d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb11ba98000)

この問題は、Issueとして報告されています。

解決に向けて取り組んでいるようですが、#19は2016年4月に報告されており、それからコメントが増え続けていますが、解決されていません。

Linuxのようにディストリビューションごとにコアのモジュールに大きく差が出てくると、かつてWindowsが陥ったDLL地獄のような問題は避けられないようですね。