- 论坛徽章:
- 3
|
本帖最后由 osdba 于 2012-08-27 19:11 编辑
“gcc -c func.c
提示 fatal error: postgres.h: NO such file or directory”
这样是不行的,编译的方法不对。
PostgreSQL写的C函数是编译成一个动态库的,需要设置头文件的路径和动态库的一些选项,比较复杂,一般是写一个Makefile文件,Makefile文件中是通过pg_config确定这些编译参数的。所以你最好是从contrib中复制一个Makefile,然后修改一下做为编译使用。
举例说明:
在一个目录下:
准备
Makefile
add_one.c
add_one.sql
uninstall_add_one.sql
文件,这些文件可以复制contrib/adminpack下面的文件,然后修改一下。
内容如下:
Makefile内容如下:
- # $PostgreSQL: pgsql/contrib/add_one/Makefile,v 0.1 2012.08.27 osdba
- MODULE_big = add_one
- PG_CPPFLAGS = -I$(libpq_srcdir)
- DATA_built = add_one.sql
- DATA = uninstall_add_one.sql
- OBJS = add_one.o
- ifdef USE_PGXS
- PG_CONFIG = pg_config
- PGXS := $(shell $(PG_CONFIG) --pgxs)
- include $(PGXS)
- else
- subdir = contrib/add_one
- top_builddir = ../..
- include $(top_builddir)/src/Makefile.global
- include $(top_srcdir)/contrib/contrib-global.mk
- endif
复制代码 add_one.c的内容如下:- #include "postgres.h"
- #include <string.h>
- #include "funcapi.h"
- PG_MODULE_MAGIC;
- /* by value */
- int
- add_one(int arg)
- {
- return arg + 1;
- }
复制代码 add_one.sql内容如下:- /* $PostgreSQL: pgsql/contrib/adminpack/adminpack.sql.in,v 1.6 2007/11/13 04:24:27 momjian Exp $ */
- CREATE OR REPLACE FUNCTION add_one(int)
- RETURNS int
- AS '$libdir/add_one', 'add_one'
- LANGUAGE C VOLATILE STRICT;
复制代码 uninstall_add_one.sql内容如下:- DROP FUNCTION add_one(int) ;
复制代码 编译之前先确定pg_config在执行路径中:
osdba@osdba-work:~/tmp/adminpack$ which pg_config
/usr/local/pgsql/bin/pg_config
编译:
osdba@osdba-work:~/tmp/add_one$ make USE_PGXS=1
sed 's,MODULE_PATHNAME,$libdir/add_one,g' add_one.sql.in >add_one.sql
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fpic -I/usr/local/pgsql8.4.13/include -I. -I/usr/local/pgsql8.4.13/include/server -I/usr/local/pgsql8.4.13/include/internal -D_GNU_SOURCE -c -o add_one.o add_one.c
add_one.c:11:1: 警告: ‘add_one’先前没有原型 [-Wmissing-prototypes]
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fpic -shared add_one.o -L/usr/local/pgsql8.4.13/lib -Wl,-rpath,'/usr/local/pgsql8.4.13/lib' -o add_one.so
进入root用户编译,注意在root用户下仍可以找到pg_config工具:
root@osdba-work:~# which pg_config
/usr/local/pgsql/bin/pg_config
root@osdba-work:/home/osdba/tmp/add_one# make USE_PGXS=1 install
/bin/sh /usr/local/pgsql8.4.13/lib/pgxs/src/makefiles/../../config/mkinstalldirs '/usr/local/pgsql8.4.13/lib'
/bin/sh /usr/local/pgsql8.4.13/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755 add_one.so '/usr/local/pgsql8.4.13/lib/add_one.so'
/bin/sh /usr/local/pgsql8.4.13/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./uninstall_add_one.sql '/usr/local/pgsql8.4.13/share/contrib'
/bin/sh /usr/local/pgsql8.4.13/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 add_one.sql '/usr/local/pgsql8.4.13/share/contrib'
测试自己写的函数:
osdba@osdba-work:~/tmp/add_one$ psql postgres
psql (8.4.13)
Type "help" for help.
postgres=# \i add_one.sql
CREATE FUNCTION
postgres=# select add_one(100)
postgres-# ;
add_one
---------
101
(1 row)
|
|