web-dev-qa-db-ja.com

Postgres 11への移行時の未定義のシンボル

Postgres 10をバージョン11にアップグレードした後、pg_upgradeを使用すると、次のエラーが発生します。

ライブラリ "$ libdir/postgis-2.4"を読み込めませんでした:エラー:ライブラリ "/usr/pgsql-11/lib/postgis-2.4.so"を読み込めませんでした:/usr/pgsql-11/lib/postgis-2.4.so :未定義のシンボル:geod_polygon_init

CentOS 7とPostgis 2.4を使用しています。

少し調べてみました。

# nm -D /usr/pgsql-11/lib/postgis-2.4.so |grep geod_polygon_init
  U geod_polygon_init

関数は共有ライブラリによってエクスポートされます!このエラーが発生するのはなぜですか?

# ld -v /usr/pgsql-11/lib/postgis-2.4.so
GNU ld version 2.27-28.base.el7_5.1
ld: warning: cannot find entry symbol _start; not setting start address
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `repalloc'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `hash_create'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `get_guc_variables'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `init_MultiFuncCall'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `SPI_exec'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `WinGetFuncArgInPartition'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `SPI_gettype'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `geod_polygon_addpoint'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `get_fn_expr_argtype'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `GetDatabaseEncoding'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `SPI_execute'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `CurrentMemoryContext'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `SPI_getvalue'
...

関連する質問:

1
david.perez

Postgisのソースコード2.4.5をダウンロードして自分でコンパイルしたところ、問題なく動作します。

ぼくの postgis-2.4.soは、yumによって提供されるものよりもはるかに大きい、2.4 Mb対750 Mb。他の生成されたライブラリからも同じことが言えます。

0
david.perez
# ld -v /usr/pgsql-11/lib/postgis-2.4.so
GNU ld version 2.27-28.base.el7_5.1
ld: warning: cannot find entry symbol _start; not setting start address
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `repalloc'
/usr/pgsql-11/lib/postgis-2.4.so: undefined reference to `hash_create'

それは実際には問題ではありません。そのようにldを使用することはできません。そこでlddを使用したいと思います。これは共有オブジェクトであり、実行可能ファイルではありません。 _start(または-eのエントリポイント)がないと、ldを呼び出して実行可能ファイルを生成できません

ライブラリ "$ libdir/postgis-2.4"を読み込めませんでした:エラー:ライブラリ "/usr/pgsql-11/lib/postgis-2.4.so"を読み込めませんでした:/usr/pgsql-11/lib/postgis-2.4.so :未定義のシンボル:geod_polygon_init

そのエラーは、古すぎるバージョンのProj4に対してリンクしていると私が考えているためです。どちらかといえば、それはディストリビューションの問題です。

1
Evan Carroll