C++ 使用C++;PostreSQL中的函数

C++ 使用C++;PostreSQL中的函数,c++,postgresql,c++17,C++,Postgresql,C++17,我在这篇博客中试用了这段代码,以测试众所周知的问题(PostgreSQL 10.1、Ubuntu 16.04)的可行性 代码(extension.cpp)似乎很简单: extern“C”{ #include//所有C头和宏都放在外部“C”中 #包括 PG_模块_魔术; } #include//C++头在外部 外部“C”{ I/SUFFOLAL(){//C++在外部“C”块中封装C++函数 _all的自动求和=0; std::向量arr{1,2,3,4,5,6,7}; 用于(自动和i:arr) _

我在这篇博客中试用了这段代码,以测试众所周知的问题(PostgreSQL 10.1、Ubuntu 16.04)的可行性

代码(
extension.cpp
)似乎很简单:

extern“C”{
#include//所有C头和宏都放在外部“C”中
#包括
PG_模块_魔术;
}
#include//C++头在外部
外部“C”{
I/SUFFOLAL(){//C++在外部“C”块中封装C++函数
_all的自动求和=0;
std::向量arr{1,2,3,4,5,6,7};
用于(自动和i:arr)
_all+=i的和;
返回所有的总和;
}
}
<代码>编译,但问题是,不能从命令的PostgreSQL中找到或调用C++函数:
g++ -c -fPIC -Wall -Werror -g3 -O0 -I$(pg_config --includedir-server) extension.cpp
g++ -shared -o my-extension.so extension.o

sudo cp my-extension.so $(pg_config --pkglibdir)

psql -U postgres -h localhost $(whoami) -c "
CREATE OR REPLACE FUNCTION 
   sumofall() RETURNS integer AS 'my-extension' 
LANGUAGE C STRICT;"
Postgres返回一个错误:

错误:找不到函数“sumofall”的函数信息 提示:SQL可调用函数需要附带 PG_函数_信息_V1(函数名)

如何解决此问题?

阅读:

version-1调用约定依赖于宏来抑制传递参数和结果的大部分复杂性。版本1函数的C声明始终为:

Datum funcname(PG_FUNCTION_ARGS)
此外,宏调用:

PG_FUNCTION_INFO_V1(funcname);
必须出现在同一源文件中。(按照惯例,它是在函数本身之前编写的。)


除了@Laurenz的基本观察之外,您还应该提供一个.control文件来安装扩展名,并告知postgresql如何使用它。 在这里,我可以显示我手边的.control文件

# file: tm_ext.control :
comment = 'Comments....'
default_version = '0.0.1'
directory = 'extension' # /usr/share/postgresql/{pg_ver}/extension/
module_pathname = '$libdir/tm_ext'
relocatable = false
schema = tm_ext
然后必须声明指向sharedlib的函数,如:

CREATE FUNCTION tm_ext.doit([args..]) RETURNS integer
     AS '$libdir/tm_ext', 'doit'
     LANGUAGE C STRICT;

阅读文档

您收到的错误消息似乎足够清楚。你尝试过它的提示吗?@某个程序员,我以前没有写过PASSql C或C++函数。这是第一个据称是C++中的PoxGREST函数的例子。只是想检查复制过程中是否遗漏了一些内容,或者示例本身不好。@tinlyx成功了吗?我在PostgreSQL语言扩展中使用C++代码也有同样的问题。@ TyLyx,它是怎么运行的?如果有正确的答案,你也能标记出来吗?或者你自己写一个答案,现在你知道了吗?