postgresql 如何为postgres写一个c++扩展?

rqmkfv5c  于 4个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(72)

我在这个链接using C++ functions in PostreSQL中找到了一些东西,但是它给C++14 and postgres的博客不能访问。我添加了一个c扩展名的util.cpp和util.h,并尝试调用func Print() util.h:

#ifdef __cplusplus
extern "C"
{
#endif

    void Print();

#ifdef __cplusplus
}
#endif

字符串
util.cpp

#include "util.h"
#include <vector>
// #include <cstring>
#include <string>
extern "C"
{
#include <postgres.h>
}

void Print()
{
    std::string s = "anc";
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    for (int i = 0; i < v.size(); i++)
    {
        elog(INFO, "vec %d", v[i]);
    }
    elog(INFO, "string %s:", s);
    elog(INFO, "Print");
}


我已经在makefile中添加了PG_CXXFLAGE和PG_CPPFLAGS:

PG_CXXFLAGS      = -std=gnu++17 -libstdc++
PG_CPPFLAGS      = -std=gnu++17 -libstdc++


在我安装扩展之后,我执行了一个SQL,但我得到:

could not load library "/data/lib/postgresql/m3v.so": /data/lib/postgresql/m3v.so: undefined symbol: __gxx_personality_v0


我希望能解决这个问题,需要一个文件来添加cpp文件为我的扩展或关于如何修改Makefile正确。

j8yoct9x

j8yoct9x1#

不熟悉库。但以前见过这种类型的错误。
让我们看看错误告诉你什么。
could not load library“/data/lib/postgresql/m3v.so“:/data/lib/postgresql/m3v.so:undefined symbol:__gxx_personality_v0
有两件事很突出。(1)www.example.com在哪里m3v.so?它是相对于你的运行路径吗?你需要编译你的程序来把它添加到你的路径吗?示例标志可能是-Wl,-rpath,path/to/lib -Lpath/to/lib -l3 v??-Wl,-rpath,path/to/lib -Lpath/to/lib -m3 v??
也许你可以将m3v.so添加到你的个人资料路径,这样它就可以工作了?
(2)这也说明你有一个未定义的符号。这字面上意味着你在一个没有定义的头中有一个定义。
举例来说:

//somelib.hpp

void someFunc();


//main.cpp

#include "somelib.hpp"

int main() {
someFunc();
return 0;
}

字符串
这显然是行不通的,因为someFunc是未定义的。
你的库需要编译吗?

相关问题