CentOS7でldconfigを使って共有ライブラリを追加する

## 概要
CentOS7では、デフォルトで/libと/usr/lib以下のファイルは、共有ライブラリとして含まれています。
それ以外のディレクトリのライブラリを追加したい場合は、以下のいずれかの方法で設定する必要があります。

1. [特定のユーザーのみが使えるようにする方法](#特定のユーザーのみが使えるようにする方法)
2. [システム全体で永続的に使いたい場合](#システム全体で永続的に使いたい場合)

## OpenSSLのインストール
今回は例として、OpenSSLを共有ライブラリに追加するため、インストールをします。

参考：[CentOS7にOpenSSL1.1.1をインストール](https://qiita.com/Esfahan/items/4e2002f4a24589b2d0bf)

## 特定のユーザーのみが使えるようにする方法
LD_LIBRARY_PATHは、/etc/ld.so.confで定義されたパスよりも優先されます。

設定したいディレクトリ以下のライブラリを全て参照するようになります。

```
$ LD_LIBRARY_PATH=/usr/local/openssl-1.1.1/lib; export LD_LIBRARY_PATH
```

設定したいディレクトリが複数ある場合は、`:`で区切って設定します。

```
$ LD_LIBRARY_PATH=/usr/local/lib:/usr/lib; export LD_LIBRARY_PATH
```

ちなみに、LD_LIBRARY_PATHの設定を以下で定義しても反映されません。

- $HOME/.profile
- /etc/profile
- /etc/environment

参考：[EnvironmentVariables - Community Help Wiki](https://help.ubuntu.com/community/EnvironmentVariables)

> LD_LIBRARY_PATH についての説明から抜粋
Note: You can only set this environment variable inside an interactive shell. Since Ubuntu 9.04 Jaunty Jackalope, LD_LIBRARY_PATH cannot be set in $HOME/.profile, /etc/profile, nor /etc/environment files. You must use /etc/ld.so.conf.d/*.conf configuration files. See Launchpad bug #366728 for more information.

参考：[LD_LIBRARY_PATH を設定しても反映されないことがある](https://kokufu.blogspot.com/2016/01/ldlibrarypath.html)


## システム全体で永続的に使いたい場合

### 追加するライブラリ
今回は例として、以下のopensslのライブラリ群を追加します。

```shell-session
$ sudo ls -l /usr/local/openssl-1.1.1/lib
total 10432
drwxr-xr-x 2 root root      39 Apr 17 04:12 engines-1.1
-rw-r--r-- 1 root root 5599274 Apr 17 04:12 libcrypto.a
lrwxrwxrwx 1 root root      16 Apr 17 04:12 libcrypto.so -> libcrypto.so.1.1
-rwxr-xr-x 1 root root 3370584 Apr 17 04:12 libcrypto.so.1.1
-rw-r--r-- 1 root root 1019068 Apr 17 04:12 libssl.a
lrwxrwxrwx 1 root root      13 Apr 17 04:12 libssl.so -> libssl.so.1.1
-rwxr-xr-x 1 root root  685240 Apr 17 04:12 libssl.so.1.1
drwxr-xr-x 2 root root      61 Apr 17 04:12 pkgconfig
```


### 共有ライブラリとして認識されているパスの確認
以下コマンドで読み込まれているパスを確認できます。

```shell-session
$ sudo ldconfig -p
```

ライブラリ追加前の状態を確認します。ssl関係のライブラリは`/lib64`のもののみ認識されています。

```shell-session
$ sudo ldconfig -p | grep libssl
        libssl3.so (libc6,x86-64) => /lib64/libssl3.so
        libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10
```

### ライブラリを追加する
システム全体に永続的にライブラリを追加したい場合は、`/etc/ld.so.conf`に定義します。
実際にファイルの中を見てみると、以下のようになっています。

```shell-session
$ sudo cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
```

`/etc/ld.so.conf`で直接定義することもできますが、`/etc/ld.so.conf.d`の下にファイルを作成して定義することを推奨します。　

/etc/ld.so.conf.d/openssl-1.1.1.confを作成して、以下を定義します。

```ini:/etc/ld.so.conf.d/openssl-1.1.1.conf
/usr/local/openssl-1.1.1/lib
```

### キャッシュファイルを更新
OSはライブラリを検索する際に、/etc/ld.so.confを直接参照するのではなく、/etc/ld.so.cacheというキャッシュファイルを参照するため、以下のコマンドでこのキャッシュファイルを更新します。

```shell-session
$ sudo ldconfig
```

### ライブラリが追加されたことを確認
以下コマンドで`/usr/local/openssl-1.1.1/lib`以下のライブラリが追加されたことを確認できます。

```diff
$ sudo ldconfig -p | grep libssl
        libssl3.so (libc6,x86-64) => /lib64/libssl3.so
        libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10
+       libssl.so.1.1 (libc6,x86-64) => /usr/local/openssl-1.1.1/lib/libssl.so.1.1
+       libssl.so (libc6,x86-64) => /usr/local/openssl-1.1.1/lib/libssl.so
```

## 関連記事
- [【Python2to3アップデート方法】目次](https://qiita.com/Esfahan/items/067484ee0cb3dd374992)

## 参考
- [共有ライブラリの追加](http://tetsuyai.hatenablog.com/entry/20111201/1324792477)
- [共有ライブラリへパスを通す](http://www.8wave.net/ldconfig.html)