我使用的是redhat linux 7.3中的PostgreSQL11.5。在sql脚本中,该函数的创建方式如下:
create or replace function alpine_miner_float_array_sum_accum(state float[], ind float[])
returns float[]
AS 'alpine_miner', 'alpine_miner_float_array_sum_accum'
language C immutable;但它会给出以下错误:
ERROR: could not load library "/usr/pgsql-11/lib/alpine_miner.so": /usr/pgsql-11/lib/alpine_miner.so: undefined symbol: Float8GetDatum
SQL state: XX000我发现/usr/pgsql-11/lib/alpine_min.so确实存在,ld命令的输出如下:
linux-vdso.so.1 => (0x00007ffda65d6000)
libc.so.6 => /lib64/libc.so.6 (0x00007eff25a67000)
/lib64/ld-linux-x86-64.so.2 (0x00007eff26051000)ldd命令:
ld: warning: cannot find entry symbol _start; not setting start address
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `construct_md_array'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `get_call_result_type'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `ArrayGetNItems'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `logf'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `deconstruct_array'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `CurrentMemoryContext'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `acosf'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `GetAttributeByName'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `elog_finish'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `errstart'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `pg_detoast_datum'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `exp'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `sqrtf'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `MemoryContextAllocZero'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `elog_start'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `errmsg'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `BlessTupleDesc'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `get_typlenbyvalalign'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `Float8GetDatum'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `log'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `pow'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `errdetail'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `DatumGetFloat8'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `errfinish'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `sqrt'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `heap_form_tuple'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `format_procedure'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `construct_array'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `MemoryContextAlloc'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `pfree'
/usr/pgsql-11/lib/alpine_miner.so: undefined reference to `errcode'你有什么想法吗?提前谢谢。
发布于 2019-08-29 12:40:51
在构建alpine_miner.so时,您是在一个PostgreSQL安装的基础上构建它的,该安装的配置与您尝试使用它的安装不同。
在标题问题的情况下,alpine_miner.so是使用未定义的USE_FLOAT8_BYVAL构建的,但您的PostgreSQL已经定义了它:
#ifdef USE_FLOAT8_BYVAL
static inline Datum
Float8GetDatum(float8 X)
{
union
{
float8 value;
int64 retval;
} myunion;
myunion.value = X;
return Int64GetDatum(myunion.retval);
}
#else
extern Datum Float8GetDatum(float8 X);
#endif但未定义的链接器引用列表还表明,您正在尝试将共享对象加载到旧的或修改过的PostgreSQL中:
例如,自2004年4月提交375369acd1c以来,BlessTupleDesc一直在服务器中。
要获得进一步的帮助,您必须公开PostgreSQL的确切制造商和版本以及alpine_miner.so的确切构建过程。
https://stackoverflow.com/questions/57702176
复制相似问题