如何解决使用多个源文件编译 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
。文档说:
这听起来正是我想要的! 所以新的 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 举报,一经查实,本站将立刻删除。