Chinaunix首页 | 论坛 | 博客
  • 博客访问: 787894
  • 博文数量: 129
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1329
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(129)

文章存档

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(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 程序中,仅实现针对数据库的操作,不做与界面相关的事情,即可很好的避开这个问题。



阅读(1048) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~