我在这个链接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正确。
1条答案
按热度按时间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)这也说明你有一个未定义的符号。这字面上意味着你在一个没有定义的头中有一个定义。
举例来说:
字符串
这显然是行不通的,因为someFunc是未定义的。
你的库需要编译吗?