我想使用stdio.h库中的函数来处理PostgreSQL C函数中的某些字符串。问题:由于某种原因,当我尝试使用CREATE EXTENSION
将其导入数据库时,它失败并返回:
ERROR: could not load library "/usr/local/lib/postgresql/test.so": Error relocating /usr/local/lib/postgresql/test.so: __sprintf_chk: symbol not found
。
这是我使用的测试功能:
#define _XOPEN_SOURCE
#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "executor/executor.h"
#include "executor/spi.h"
#include "utils/builtins.h"
#include <stdlib.h>
#include <stdio.h>
PG_FUNCTION_INFO_V1(printTest);
Datum printTest(PG_FUNCTION_ARGS) {
char str[50];
int i = 9;
sprintf(str, "Hello I am PostgreSQL %d ! \n", i);
PG_RETURN_TEXT_P(cstring_to_text(str));
}
这是我的Makefile:
PG_CPPFLAGS = -I$(/usr/include)
SHLIB_LINK = $(stdio.h)
EXTENSION = test
DATA = test--0.1.sql
MODULE_big = test
OBJS = test.o
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
我正在Docker容器中使用PostgreSQL 9.6。
我已经在另一个库中遇到这样的问题,解决方案是更改makefile。这次我也尝试这样做,但是它不起作用,我不知道还有什么要更改的。
如果您知道导致问题的原因,我们将非常欢迎。
我知道一本书或网站的名称,该书或网站提供了有关如何为Postgres编写C函数的良好文档,因此,我们深受欢迎。我经常遇到这种愚蠢的问题,因为官方文档太弱了。
答案 0 :(得分:0)
您的功能运行正常,但您忘记了该行
PG_MODULE_MAGIC;
开始。
构建共享库的方式一定存在问题。
正确的是:
PATH=/where/your/postgres/is/bin:$PATH make
有关更多信息,请共享您的扩展SQL脚本,控制文件和确切的构建过程。