0

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

4

0 回答 0