微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用多个源文件编译 postgres 扩展

如何解决使用多个源文件编译 postgres 扩展

这很可能是因为我完全缺乏 C/C++ 工具链的经验。

我正在尝试为 postgres 构建一个简单的扩展。我遵循了官方文档(缺少一些示例)。这是一个简单的例子:

- extension.c
- folder  
 |- file.c  
 |- file.h

extension.c

includes as per documentation...
#include 'folder/file.h'

function_from_filec()...

这是扩展Makefile:

PG_CFLAGS = -Ifolder/
PG_CPPFLAGS = -Ifolder/
EXTENSION = extension
DATA = sql/extension--0.0.1.sql
REGRESS = extension_test
MODULES = extension

# postgres build stuff
PG_CONfig = pg_config
PGXS := $(shell $(PG_CONfig) --pgxs)
include $(PGXS)

我的问题是生成的库没有来自 file.c 的符号。当我将扩展加载到我的 PG 实例时,它会抱怨 undefined symbols

我阅读了 gcc,似乎我必须指定它应该使用的源文件。所以我将我的 Makefile 更改为:

PG_CFLAGS = -Ifolder/ folder/file.c
PG_CPPFLAGS = -Ifolder/
EXTENSION = extension
DATA = sql/extension--0.0.1.sql
REGRESS = extension_test
MODULES = extension

# postgres build stuff
PG_CONfig = pg_config
PGXS := $(shell $(PG_CONfig) --pgxs)
include $(PGXS)

我得到:

gcc: 致命错误:不能用“-c”、“-S”或“-E”来指定“-o” 多个文件

因此,进一步阅读使我想到了 MODULE_big。文档说:

从多个源文件构建的共享库(列表对象 OBJS 中的文件

这听起来正是我想要的! 所以新的 makefile 看起来像:

PG_CFLAGS = -Ifolder/
PG_CPPFLAGS = -Ifolder/
EXTENSION = extension
DATA = sql/extension--0.0.1.sql
REGRESS = extension_test
MODULES_big = extension
OBJS = extension folder/file

# postgres build stuff
PG_CONfig = pg_config
PGXS := $(shell $(PG_CONfig) --pgxs)
include $(PGXS)

运行 make 给了我:

/usr/bin/ld: cannot find -lpgcommon
/usr/bin/ld: cannot find -lpgport
/usr/bin/ld: cannot find -lselinux
/usr/bin/ld: cannot find -lxslt
/usr/bin/ld: cannot find -lxml2
/usr/bin/ld: cannot find -lpam
/usr/bin/ld: cannot find -lgssapi_krb5
/usr/bin/ld: cannot find -ledit
collect2: error: ld returned 1 exit status

此时我真的不知道从哪里开始。

我可以通过将folder/file.c内容粘贴到extension.c中并使用makefile的第一个示例来完全解决这个问题。然而,这显然不是一个很好的解决方案......

就像我说的,这很可能只是我对 C/C++ 工具链不够了解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。