关于在 sco openserver 系统上 ecpg 与原生的 c 界面库的冲突问题及解决措施-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 775515
  • 博文数量: 129
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1329
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

(129)

  • (2)
  • (3)
  • (2)
  • (20)
  • (55)
  • (47)
  • (0)
文章存档

(10)

(4)

(10)

(9)

(1)

(1)

(4)

(3)

(12)

(24)

(2)

(8)

(6)

(34)

(1)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2021-12-10 15:25:57

话不多说,看代码:

a.pgc 文件:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #include <curses.h>

  5. int dbconnect( void );

  6. int main ( void )
  7. {
  8.         window *sc;

  9.         initscr();

  10.         sc= newwin(24,80,0,0);
  11.         box(sc,0,0);
  12.         mvwprintw(sc,8,8,"connect database = %d",dbconnect ());
  13.         touchwin(sc);wrefresh(sc);

  14.         wgetch(sc);

  15.         endwin();
  16.         return 0;
  17. }

  18. int dbconnect ( void )
  19. {
  20.         exec sql begin declare section;
  21.         char *target="sampledb@localhost:5432";
  22.         char *user="postgres";
  23.         char *passwd="postgres";
  24.         int port = 5432;
  25.         exec sql end declare section;

  26.         exec sql connect to :target user :user using :passwd;


  27.         if (sqlca.sqlcode == 0 )
  28.                 printf("connect sucesess ... \n");
  29.         else {
  30.                 printf("connect faild ... ... \n");
  31.                 printf( " sqlca.sqlcode = %d \n",sqlca.sqlcode );
  32.         }

  33.         return sqlca.sqlcode;
  34. }

makefile 文件

点击(此处)折叠或打开

  1. target = demo_a
  2. cc = cc
  3. cflags = -o2 -c -k pic -ddebug
  4. # -wall
  5. ecpg = ecpg -c
  6. ar = ar -rcvl
  7. ranlib = ranlib
  8. incldir = -i. -i$(postgresql_dir)/include -i $(home)/source_code/include -i/usr/include/libxml2
  9. libdir = -l. -l$(home)/source_code/lib -l$(postgresql_dir)/lib
  10. libs = -lecpg -lcurses
  11. obj =
  12. all:$(target)
  13. clean:
  14.      rm -f $(target) *.o core.* .*.swp *.pgc~ *.c~
  15. demo_a:a.o
  16.      $(cc) -o $@ $^ $(libdir) $(libs)
  17. # mv $@ $(home)/bin
  18. # ################################################################################
  19. .suffixes:
  20. .suffixes:.c .o .pgc
  21. .pgc.c:
  22.      $(ecpg) $(include) $<
  23. .c.o:
  24.     $(cc) $(cflags) $(incldir) $<
编译出错如下:
ecpg -c  a.pgc
cc -o2 -c -k pic -ddebug -i. -i/opt/postgresql/12.9/include -i /home/work/source_code/include -i/usr/include/libxml2 a.c
ux:acomp: error: "/usr/include/curses.h", line 60: invalid type combination
ux:acomp: warning: "/usr/include/curses.h", line 60: useless declaration
ux:acomp: warning: "/usr/include/curses.h", line 60: typedef declares no type name
gmake: *** [a.o] error 1
rm a.c

出错的原因是  bool 定义冲突,找了一圈,除了将 cursess.h 文件中的 bool 定义删除能解决外,其它的办法没有找到。

一个可以解决的合理办法是将上面的程序拆分,拆分后的结果如下:

a.c 文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #include <curses.h>

  5. int dbconnect( void );

  6. int main ( void )
  7. {
  8.         window *sc;

  9.         initscr();

  10.         sc= newwin(24,80,0,0);
  11.         box(sc,0,0);
  12.         mvwprintw(sc,8,8,"connect database = %d",dbconnect ());
  13.         touchwin(sc);wrefresh(sc);

  14.         wgetch(sc);

  15.         endwin();
  16.         return 0;
  17. }

b.pgc 文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int dbconnect ( void )
  5. {
  6.         exec sql begin declare section;
  7.         char *target="sampledb@localhost:5432";
  8.         char *user="postgres";
  9.         char *passwd="postgres";
  10.         int port = 5432;
  11.         exec sql end declare section;

  12.         exec sql connect to :target user :user using :passwd;


  13.         if (sqlca.sqlcode == 0 )
  14.                 printf("connect sucesess ... \n");
  15.         else {
  16.                 printf("connect faild ... ... \n");
  17.                 printf( " sqlca.sqlcode = %d \n",sqlca.sqlcode );
  18.         }

  19.         return sqlca.sqlcode;
  20. }

makefile 文件

点击(此处)折叠或打开

  1. target = demo_a
  2. cc = cc
  3. cflags = -o2 -c -k pic -ddebug
  4. # -wall
  5. ecpg = ecpg -c
  6. ar = ar -rcvl
  7. ranlib = ranlib
  8. incldir = -i. -i$(postgresql_dir)/include -i $(home)/source_code/include -i/usr/include/libxml2
  9. libdir = -l. -l$(home)/source_code/lib -l$(postgresql_dir)/lib
  10. libs = -lecpg -lcurses
  11. obj =
  12. all:$(target)
  13. clean:
  14.    rm -f $(target) *.o core.* .*.swp *.pgc~ *.c~
  15. demo_a:a.o b.o
  16.     $(cc) -o $@ $^ $(libdir) $(libs)
  17. # mv $@ $(home)/bin
  18. # ################################################################################
  19. .suffixes:
  20. .suffixes:.c .o .pgc
  21. .pgc.c:
  22.     $(ecpg) $(include) $<
  23. .c.o:
  24.     $(cc) $(cflags) $(incldir) $<

编译结果如下:
cc -o2 -c -k pic -ddebug -i. -i/opt/postgresql/12.9/include -i /home/work/source_code/include -i/usr/include/libxml2 a.c
ecpg -c  b.pgc
cc -o2 -c -k pic -ddebug -i. -i/opt/postgresql/12.9/include -i /home/work/source_code/include -i/usr/include/libxml2 b.c
cc -o demo_a a.o b.o -l. -l/home/work/source_code/lib -l/opt/postgresql/12.9/lib -lecpg -lcurses
rm b.c



总结:
=========================================================
ecpg 编译时,首先将 .pgc 的文件编译成 .c 的文件,然后再调用 cc 编译成可执行文件,当 .pgc 文件中有界面操作的头文件时,其生成的 .c 文件中会产生 bool 定义的冲突。
一个解决的办法是:将 .pgc 文件与 .c 的文件进行分开,在 .pgc 的文件中,不要引用 curses.h 的头文件,即: .pgc 程序中,仅实现针对数据库的操作,不做与界面相关的事情,即可很好的避开这个问题。



阅读(840) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图