Armadilloフォーラム

実行時のエラー

nao112641433

2017年9月17日 22時32分

Debian 9にてarm-linux-gnueabi-g++(VERSION 6.3.0)でコンパイルしたファイルをArmadillo上で実行しようとしたところ、
/lib/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (require)というエラーが出力されてしまいました。
よければ、解決方法をお教えいただけますでしょうか。

コメント

三原と申します。

結論から言えば、ATDE の開発環境でビルドする方が無難ではないかと考えます。

glibc は、新しいバージョンから関数が追加されることがあります。

実例は下記に
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/clock_gettime.2.html

> #include
>
> int clock_getres(clockid_t clk_id, struct timespec *res);
>
> int clock_gettime(clockid_t clk_id, struct timespec *tp);
>
> int clock_settime(clockid_t clk_id, const struct timespec *tp);
>
> -lrt とリンクする (バージョン 2.17 より前の glibc のみ)

バージョン 2.17 より前の glibc ではリンク時に -lrt オプションをつけなければ使用できなかった関数が、それより上のバージョンではリンク時にオプションをつけなくても使用できるようになっています。

同様の関数が他にもあります。

このようなとき、実行時にトラブルが起きないよう、実行ファイルには最低限必要な glibc のバージョンが埋め込まれます。実行するシステムの glibc が古いと、必要な関数を動的リンクできないので、エラーを出すようになっています。

> /lib/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (require)というエラーが出力されてしまいました。

このエラーが、新しい glibc を使用する設定でリンクした実行ファイルを、古い glibc しかないシステムで動作させて、glibc 側に関数が足りないときに出るエラーです。

ビルドする gcc と glibc を変えないとすると、アプリケーションが使用している関数を精査して、新しい glibc にしか存在しない関数を古い glibc にも存在する関数に置き換えれば、必要な glibc のバージョンが下がって、実行できるようになります。

それは、使用している関数を全て man で確認して必要なバージョンを探る作業になるので、極めて手間がかかります。

> Debian 9にてarm-linux-gnueabi-g++(VERSION 6.3.0)でコンパイルした

Debian 9 の arm-linux-gnueabi-g++ がリンクする glibc は、Armadillo-440 に比べて、新しすぎるとおもわれます。
事情がおありなのだと思いますが、実機で動かすことを優先させて、ATDE でアプリケーションをビルドなされる方がトラブルを避けられると想像します。

返信ありがとうございます。
Debian上の仮想マシンでATDEを動作させることで解決いたしました。
ありがとうございました。