gpt4 book ai didi

c - PostgreSQL自定义C函数导入失败: "sprintf_chk: symbol not found"

转载 作者:行者123 更新时间:2023-11-30 16:13:19 26 4
gpt4 key购买 nike

我想使用 stdio.h 库中的函数来操作 PostgreSQL C 函数中的一些字符串。问题:由于某种原因,当我尝试使用 CREATE EXTENSION 将其导入数据库时​​,它失败并返回:错误:无法加载库“/usr/local/lib/postgresql/test.so”:重定位/usr/local/lib/postgresql/test.so 时出错:__sprintf_chk:找不到符号。这是我使用的测试函数:

#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 函数的良好文档,我们更欢迎您。我经常遇到这种愚蠢的问题,因为官方文档太弱了。

最佳答案

你的函数工作正常,只是你忘记了该行

PG_MODULE_MAGIC;

从头开始。

您构建共享对象的方式一定有问题。

正确的是:

PATH=/where/your/postgres/is/bin:$PATH make

有关更多信息,请分享您的扩展 SQL 脚本、控制文件和确切的构建过程。

关于c - PostgreSQL自定义C函数导入失败: "sprintf_chk: symbol not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com