免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4982 | 回复: 3
打印 上一主题 下一主题

Postgresql 下编译 C function 问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-16 10:08 |只看该作者 |倒序浏览
大家好,小弟刚开始学习 postgresql, 想写个最简单的 C语言的function。但是对环境不熟悉。

我在ubuntu 10.10 下安装了 postgresql 8.4

根据文档copy了个最简单的C function:

func.c:

#include "postgres.h"
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

/* by value */

int
add_one(int arg)
{
    return arg + 1;
}

但是通过 gcc -c func.c

提示 fatal error: postgres.h: NO such file or directory,

请问 这个是因为环境的问题么,我是否应该在postgresql 特定的目录下编译 呢。


第二个问题是, 我下载了contrib/fuzzystringmatch 的 c 程序 的源代码,和makefile 文件, 想在greenplum 底下编译,有没有这方面的资料可以参考呢,对C 和makefile 都是初学者。

非常感谢,在线急等


论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
2 [报告]
发表于 2012-08-27 14:32 |只看该作者
本帖最后由 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内容如下:

  1. # $PostgreSQL: pgsql/contrib/add_one/Makefile,v 0.1 2012.08.27 osdba

  2. MODULE_big = add_one
  3. PG_CPPFLAGS = -I$(libpq_srcdir)
  4. DATA_built = add_one.sql
  5. DATA = uninstall_add_one.sql
  6. OBJS = add_one.o

  7. ifdef USE_PGXS
  8. PG_CONFIG = pg_config
  9. PGXS := $(shell $(PG_CONFIG) --pgxs)
  10. include $(PGXS)
  11. else
  12. subdir = contrib/add_one
  13. top_builddir = ../..
  14. include $(top_builddir)/src/Makefile.global
  15. include $(top_srcdir)/contrib/contrib-global.mk
  16. endif
复制代码
add_one.c的内容如下:
  1. #include "postgres.h"
  2. #include <string.h>
  3. #include "funcapi.h"

  4. PG_MODULE_MAGIC;

  5. /* by value */

  6. int
  7. add_one(int arg)
  8. {
  9.     return arg + 1;
  10. }
复制代码
add_one.sql内容如下:
  1. /* $PostgreSQL: pgsql/contrib/adminpack/adminpack.sql.in,v 1.6 2007/11/13 04:24:27 momjian Exp $ */
  2. CREATE OR REPLACE FUNCTION add_one(int)
  3. RETURNS int
  4. AS '$libdir/add_one', 'add_one'
  5. LANGUAGE C VOLATILE STRICT;
复制代码
uninstall_add_one.sql内容如下:
  1. 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)




论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2012-08-27 17:27 |只看该作者
回复 2# osdba


    兄弟最近忙什么呢,也不见常来了啊。

论坛徽章:
0
4 [报告]
发表于 2012-09-06 01:45 |只看该作者
很好啊.谢谢楼主啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP