系统是solaris 10
-bash-3.00$ make s1
make: Fatal error: Don't know how to make target `s1.o'
由于make s1的提示不在清楚,于由就用proc编释一下,出现在以下提示信息。
-bash-3.00$ proc iname = s1.pc oname = s1.c Pro*C/C++: Release 10.2.0.2.0 - Production on Fri Mar 13 15:58:44 2009Copyright (c) 1982, 2005, Oracle. All rights reserved.System default option values taken from: /export/home/oracle/product/10g/precomp/admin/pcscfg.cfgPCC-F-02044, CMD-LINE: Illegal or out of range value for option: s1.c不知道哪里出错了,下面是代码:
1 #include <stdio.h>
2 #include <strings.h>
3 #define UNAME_LEN 20
4 #define PWD_LEN 40
5 varchar username[UNAME_LEN];
6 varchar password[PWD_LEN];
7 struct
8 {
9 varchar emp_name[UNAME_LEN];
10 float salary;
11 float commission;
12 }emprec;
13 struc
14 {
15 short emp_name_ind;
16 short sal_ind;
17 short comm_ind;
18 }emprec_ind;
19 int emp_number;
20 int total_queried;
21 #include <sqlca.h>
22 void sql_error(char *);
23 void main(void)
24 {
25 char temp_char[32];
26 strncpy( (char *)username.arr,"scdb",UNAME_LEN);
27 username.len = strlen( (char *)username.arr );
28 strncpy( (char *)password.arr,"scdb",PWD_LEN);
29 password.len = strlen( (char *)password.arr );
30 EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error --\n");
31 EXEC SQL CONNECT :username INDENTIFIED BY :password;
32 /*
33 printf("\nConnected to Oracle as user:%s\n",username.arr);
34 total_queried = 0;
35 for(;;)
36 {
37 EXEC SQL WHENEVER NOT FOUND DO break;
38 for(;;)
39 {
40 emp_number = 0;
41 printf("\nEnter employee number(0 to quit):");
42 gets(temp_char);
43 emp_number = atoi( temp_char );
44 if( emp_number == 0 )
45 {
46 break;
47 }//End if;
48 EXEC SQL select ename,sal,nvl(comm,0)
49 INTO :emprec INDICATOR :emprec_ind
50 FROM emp
51 where empno = :emp_number;
52 printf("\n\nEmployee\tSalary\t\tCommission\n");
53 printf("----------\t------\t\t----------\n");
54 emprec.emp_name.arr[emprec.emp_name.len] = '\0\';
55 printf("%-8s\t%6.2f\t\t,emprec.emp_name.arr,emprec.salary);
56 if( emprec_ind.comm_ind == -1 )
57 {
58 printf("NULL\n");
59 }
60 else
61 {
62 printf("6.2f\n",emprec.commission);
63 }
64 total_queried++;
65 }
66 if( emp_number == 0 )
67 {
68 break;
69 }
70 printf("\nNot a valid employee number -try again.\n");
71 }
72 printf("\t\tTotal rows returned was %d.\n",total_queried);
73 printf("\nG'day.\n\n\n");
74 EXEC SQL COMMIT WORK RELEASE;
75 exit(0);
76 }
77 void sql_error(char *msg)
78 {
79 char err_msg[128];
80 int buf_len,msg_len;
81 EXEC SQL WHENEVER SQLERROR CONTINUE;
82 printf("\n%s\n",msg);
83 buf_len = sizeof( err_msg );
84 sqlglm(err_msg,&buf_len,&msg_len );
85 printf("%.*s\n",msg_len,err_msg );
86 EXEC SQL ROLLBACK RELEASE;
87 exit(1);
88 }//End sql_error;
我的makefile内容如下:
1 include $(ORACLE_HOME)/rdbms/lib/env_rdbms.mk
2
3 ORAINC=${ORACLE_HOME}/precomp/public
4 ORALIB=${ORACLE_HOME}/lib
5
6 PROC=proc
7 CC = gcc -ggdb3 -Wall
8 PROCPPFLAGS = \
9 userid = scdb/scdb \
10 sqlcheck = semantisc \
11 include = ${ORACLE_HOME}/rdbms/public \
12 include = $(ORAINC) \
13 lines = true \
14 parse = full
15
16 CFLAGS= -I $(ORAINC) -I ${ORACLE_HOME}/rdbms/public
17
18 .SUFFIXES: .o .c .pc
19 .pc .c:
20 @$(PROC) $(PROCPPFLAGS) iname = $<
21 .c .o:
22 @$(CC) $(CFLAGS) -c $<
23 .pc .o:
24 @$(PROC) $(PROCPPFLAGS) iname = $<
25 @$(CC) $(CFLAGS) -c $(<:.pc=.c)
26
28 OBJ=s1.o
29 s1:$(OBJ)
30 @$(CC) $(CFLAGS) $(OBJ) -o s1 -L ${ORACLE_HOME}/lib $(PROLDLIBS) -lm
31 @rm -f $(OBJ)
32 @rm -f *.lis
33 all:
34 @make sqlvcp
-bash-3.00$ make s1
make: Fatal error: Don't know how to make target `s1.o'
由于make s1的提示不在清楚,于由就用proc编释一下,出现在以下提示信息。
-bash-3.00$ proc iname = s1.pc oname = s1.c Pro*C/C++: Release 10.2.0.2.0 - Production on Fri Mar 13 15:58:44 2009Copyright (c) 1982, 2005, Oracle. All rights reserved.System default option values taken from: /export/home/oracle/product/10g/precomp/admin/pcscfg.cfgPCC-F-02044, CMD-LINE: Illegal or out of range value for option: s1.c不知道哪里出错了,下面是代码:
1 #include <stdio.h>
2 #include <strings.h>
3 #define UNAME_LEN 20
4 #define PWD_LEN 40
5 varchar username[UNAME_LEN];
6 varchar password[PWD_LEN];
7 struct
8 {
9 varchar emp_name[UNAME_LEN];
10 float salary;
11 float commission;
12 }emprec;
13 struc
14 {
15 short emp_name_ind;
16 short sal_ind;
17 short comm_ind;
18 }emprec_ind;
19 int emp_number;
20 int total_queried;
21 #include <sqlca.h>
22 void sql_error(char *);
23 void main(void)
24 {
25 char temp_char[32];
26 strncpy( (char *)username.arr,"scdb",UNAME_LEN);
27 username.len = strlen( (char *)username.arr );
28 strncpy( (char *)password.arr,"scdb",PWD_LEN);
29 password.len = strlen( (char *)password.arr );
30 EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error --\n");
31 EXEC SQL CONNECT :username INDENTIFIED BY :password;
32 /*
33 printf("\nConnected to Oracle as user:%s\n",username.arr);
34 total_queried = 0;
35 for(;;)
36 {
37 EXEC SQL WHENEVER NOT FOUND DO break;
38 for(;;)
39 {
40 emp_number = 0;
41 printf("\nEnter employee number(0 to quit):");
42 gets(temp_char);
43 emp_number = atoi( temp_char );
44 if( emp_number == 0 )
45 {
46 break;
47 }//End if;
48 EXEC SQL select ename,sal,nvl(comm,0)
49 INTO :emprec INDICATOR :emprec_ind
50 FROM emp
51 where empno = :emp_number;
52 printf("\n\nEmployee\tSalary\t\tCommission\n");
53 printf("----------\t------\t\t----------\n");
54 emprec.emp_name.arr[emprec.emp_name.len] = '\0\';
55 printf("%-8s\t%6.2f\t\t,emprec.emp_name.arr,emprec.salary);
56 if( emprec_ind.comm_ind == -1 )
57 {
58 printf("NULL\n");
59 }
60 else
61 {
62 printf("6.2f\n",emprec.commission);
63 }
64 total_queried++;
65 }
66 if( emp_number == 0 )
67 {
68 break;
69 }
70 printf("\nNot a valid employee number -try again.\n");
71 }
72 printf("\t\tTotal rows returned was %d.\n",total_queried);
73 printf("\nG'day.\n\n\n");
74 EXEC SQL COMMIT WORK RELEASE;
75 exit(0);
76 }
77 void sql_error(char *msg)
78 {
79 char err_msg[128];
80 int buf_len,msg_len;
81 EXEC SQL WHENEVER SQLERROR CONTINUE;
82 printf("\n%s\n",msg);
83 buf_len = sizeof( err_msg );
84 sqlglm(err_msg,&buf_len,&msg_len );
85 printf("%.*s\n",msg_len,err_msg );
86 EXEC SQL ROLLBACK RELEASE;
87 exit(1);
88 }//End sql_error;
我的makefile内容如下:
1 include $(ORACLE_HOME)/rdbms/lib/env_rdbms.mk
2
3 ORAINC=${ORACLE_HOME}/precomp/public
4 ORALIB=${ORACLE_HOME}/lib
5
6 PROC=proc
7 CC = gcc -ggdb3 -Wall
8 PROCPPFLAGS = \
9 userid = scdb/scdb \
10 sqlcheck = semantisc \
11 include = ${ORACLE_HOME}/rdbms/public \
12 include = $(ORAINC) \
13 lines = true \
14 parse = full
15
16 CFLAGS= -I $(ORAINC) -I ${ORACLE_HOME}/rdbms/public
17
18 .SUFFIXES: .o .c .pc
19 .pc .c:
20 @$(PROC) $(PROCPPFLAGS) iname = $<
21 .c .o:
22 @$(CC) $(CFLAGS) -c $<
23 .pc .o:
24 @$(PROC) $(PROCPPFLAGS) iname = $<
25 @$(CC) $(CFLAGS) -c $(<:.pc=.c)
26
28 OBJ=s1.o
29 s1:$(OBJ)
30 @$(CC) $(CFLAGS) $(OBJ) -o s1 -L ${ORACLE_HOME}/lib $(PROLDLIBS) -lm
31 @rm -f $(OBJ)
32 @rm -f *.lis
33 all:
34 @make sqlvcp
27
28 strncpy( (char *)password.arr,"scdb",PWD_LEN);
这两句错了,不应赋UNAME_LEN和PWD_LEN,应赋"scdb"的长度