/home/amgsk

アプリケーションが起動できないとき

· amgsk

たまにバージョンの差異が原因でアプリケーションが起動できないときがある。 そんなときの対処としては以下になる。

  • シンボリックリンクで最新バージョンを過去バージョンで偽装する
  • 共有ライブラリのバージョンを落とす
  • アプリケーションバージョンを落とす

今回はfreecadで起動できない問題に遭遇したので対処例として書いておく。
rofiでfreecadを起動しようとしたところ、無反応だったのでターミナルから起動すると以下エラーログが出力されていた。

freecad: error while loading shared libraries: libxerces-c-3.2.so: cannot open shared object file: No such file or directory

バージョンは異なるものの、xerces-cはインストールはされている。指定バージョン(今回のケースだと3.2系)に依存している模様。

> yay -Qi xerces-c
Name            : xerces-c
Version         : 3.3.0-1
Description     : A validating XML parser written in a portable subset of C++
Architecture    : x86_64
URL             : https://xerces.apache.org/xerces-c/
Licenses        : APACHE
Groups          : None
Provides        : None
Depends On      : gcc-libs  curl  libnsl  icu
Optional Deps   : None
Required By     : freecad  libkolabxml
Optional For    : None
Conflicts With  : None
Replaces        : None
Installed Size  : 8.11 MiB
Packager        : Lukas Fleischer <lfleischer@archlinux.org>
Build Date      : Sun 02 Feb 2025 11:29:45 PM JST
Install Date    : Mon 03 Feb 2025 08:03:29 AM JST
Install Reason  : Installed as a dependency for another package
Install Script  : No
Validated By    : Signature

ライブラリをlibxerces-c-3.2.soに偽装して試してみる。
既存のlibxerces-c-3.3.soを3.2としてシンボリックリンクを貼る。

sudo ln -s /usr/lib/libxerces-c-3.3.so /usr/lib/libxerces-c-3.2.so

どうやら3.2にどっぷり依存しているようでシンボルの参照エラーが起きていた。

freecad: symbol lookup error: /usr/lib/freecad/lib/libFreeCADBase.so: undefined symbol: _ZTIN11xercesc_3_214BinInputStreamE

アプリケーションのバージョンは落としたくないので、上記の方法は諦めxerces-cをダウングレードすることとした。

sudo downgrade xerces-c

downgrade

しばらくは/etc/pacman.confIgnorePkgxerces-cを指定しておくとよい。

[options]
IgnorePkg = xerces-c

これで起動できるようになった。