这很可能源于我完全缺乏使用 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++ 工具链不够了解。