我现在用g++ 编译 .pc文件 时, 编译两个单独的文件都没问题 但连接两个 .O 时 就报错了
数据库是 oracle 10g
OS : Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
Kernel 2.6.9-42.ELsmp on an i686
makefile 如下:INCD = $(HOME)/app/eod/inc
OBJD = $(EODBASE)/obj
CURRINCD = ./CC = g++32 $(CGFLG)
CPFLAGS = -D$(PROJECT_NAME) -I$(INCD) -I$(HOME)/app/common/inc \
-I$(HOME)/ibte/inc -I$(HOME)/app/public/inc \
-I/home/oracle/ora10g/product/10.2.0/db_1/precomp/publicPROC = $(ORACLE_HOME)/bin/proc #for oracle API
PROCPARAM = CODE=CPP CPP_SUFFIX=cc parse=none
PCCPFLAGS= ireclen=132 oreclen=132 select_error=no char_map=string lines=yes
PROCPLSFLAGS= sqlcheck=full userid=$(ORACLE_DBU)/$(ORACLE_DBPW)@$(ORACLE_SID)
DB_LIBS = -L/home/oracle/ora10g/product/10.2.0/db_1/lib -lclntsh -ldl -lm -lpthread
project : dbconn.o funcs.o testEXE
rm -f tp??????dbconn.o: dbconn.pc
$(PROC) $(PROCPARAM) \
INCLUDE=$(CURRINCD) \
INAME=dbconn.pc \
ONAME=dbconn.cc \
$(PCCPFLAGS) \
$(PROCPLSFLAGS)
$(CC) $(CPFLAGS) -o $@ -c dbconn.cc
rm -f dbconn.cc dbconn.lis tp??????funcs.o: funcs.pc
$(PROC) $(PROCPARAM) \
INCLUDE=$(CURRINCD) \
INAME=funcs.pc \
ONAME=funcs.cc \
$(PCCPFLAGS) \
$(PROCPLSFLAGS)
$(CC) $(CPFLAGS) -c funcs.cc -o $@
rm -f funcs.cc funcs.lis tp??????testEXE: funcs.o dbconn.o
$(CC) $(CPFLAGS) -o $@ funcs.o dbconn.o $(DB_LIBS)
rm -f tp*
--------------------------------------------------------------------------------------------
程序也很简单 是为了做测试用的 两个 .pc 文件, 两个头文件,都在当前目录下 编译嚣是\usr\bin\g++32
// implement.h 看过网上网友对这个问题的解决方法 我也把这两个单放一个头文件里定义
#ifndef _IMPLEMENT
#define _IMPLEMENT
EXEC SQL include sqlca;
EXEC SQL include oraca;
#endif
-------------------------------------------------------------------------------------
// comm.h 引入了 implement.h
EXEC SQL include "implement.h";EXEC SQL BEGIN DECLARE SECTION;
typedef struct st_actioninfo
{
char acttype[ 2 + 1 ];
char actioncode[ 2 + 1 ];
char rspcode[ 2 + 1 ];
long priority;
long actiondesc[ 128 + 1 ];
long multilangvarcode[ 20 + 1 ];
}ST_ACTIONINFO;
typedef struct st_actioninfo_s
{
short acttype;
short actioncode;
short rspcode;
short priority;
short actiondesc;
short multilangvarcode;
}ST_ACTIONINFO_S;
EXEC SQL END DECLARE SECTION;
int query_tbl( int );
----------------------------------------------------------------------
// dbconn.pc 主函数 调一个查询数据库记录的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL INCLUDE "comm.h";
#define SQLCODE sqlca.sqlcodeint openDB( char *username, char *passwd )
{
EXEC SQL BEGIN DECLARE SECTION;
long recnum = 0;
char user[ 10 ];
char paswd[ 10 ];
EXEC SQL END DECLARE SECTION;
int ret;
memset( user, 0, sizeof( user ) );
memset( paswd, 0, sizeof( paswd ) );
strcpy( user, username );
strcpy( paswd, passwd ); EXEC SQL CONNECT :user IDENTIFIED by :paswd;
if( SQLCODE<0 )
{
printf( "DB Connect failed sqlcode[%d]!\n", SQLCODE );
return (-1);
}
else
{
printf( "DB Connect OK!\n" );
ret = query_tbl( 1 );
}
return 0;
}
int main( int argc, char **argv )
{
int ret;
ret = openDB( argv[1], argv[2] );
if( ret < 0 )
{
printf(" openDB failed \n" );
return -1;
}
return 0;
}-------------------------------------------------------------------------------
// funcs.pc 只有一个查询并显示的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL INCLUDE "comm.h";
int query_tbl( int rownum )
{
EXEC SQL BEGIN DECLARE SECTION;
int rownum_t;
ST_ACTIONINFO s_actioninfo;
ST_ACTIONINFO_S s_actioninfo_s;
EXEC SQL END DECLARE SECTION;
rownum_t = rownum;
EXEC SQL SELECT * INTO :s_actioninfo:s_actioninfo_s
FROM actioninfo WHERE rownum= :rownum_t;
printf( "---------Table terminfo has record------------\n" );
printf( "acttype [%s]\n", s_actioninfo.acttype );
printf( "actioncode [%s]\n", s_actioninfo.actioncode );
printf( "rspcode [%s]\n", s_actioninfo.rspcode );
printf( "priority [%d]\n", s_actioninfo.priority );
printf( "actiondesc [%s]\n", s_actioninfo.actiondesc );
printf( "multilangvarcode [%s]\n", s_actioninfo.multilangvarcode );
return 0;
}
--------------------------------------------------------------------------------------
应该不会有头文件重复定义的情况了,但编译结果却是:
dbconn.o(.bss+0x0): In function `openDB(char*, char*)':
/home/mdv2ref/priv/jerry/cpptest/dbtest/src/dbconn.pc:15: multiple definition of `sqlca'
funcs.o(.bss+0x0):/home/mdv2ref/priv/jerry/cpptest/dbtest/src/funcs.pc:12: first defined here
dbconn.o(.bss+0xa0): In function `openDB(char*, char*)':
/home/mdv2ref/priv/jerry/cpptest/dbtest/src/dbconn.pc:36: multiple definition of `oraca'
funcs.o(.bss+0xa0):/home/mdv2ref/priv/jerry/cpptest/dbtest/src/funcs.pc:21: first defined here
collect2: ld returned 1 exit status
make: *** [testEXE] Error 1所有方法都试过了 不行 , 请高手们帮忙看看是什么原因, 如果可以 你们氢这些代码在你们的环境编一下 给我一个解决方案,这是全整的代码。 谢谢!
数据库是 oracle 10g
OS : Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
Kernel 2.6.9-42.ELsmp on an i686
makefile 如下:INCD = $(HOME)/app/eod/inc
OBJD = $(EODBASE)/obj
CURRINCD = ./CC = g++32 $(CGFLG)
CPFLAGS = -D$(PROJECT_NAME) -I$(INCD) -I$(HOME)/app/common/inc \
-I$(HOME)/ibte/inc -I$(HOME)/app/public/inc \
-I/home/oracle/ora10g/product/10.2.0/db_1/precomp/publicPROC = $(ORACLE_HOME)/bin/proc #for oracle API
PROCPARAM = CODE=CPP CPP_SUFFIX=cc parse=none
PCCPFLAGS= ireclen=132 oreclen=132 select_error=no char_map=string lines=yes
PROCPLSFLAGS= sqlcheck=full userid=$(ORACLE_DBU)/$(ORACLE_DBPW)@$(ORACLE_SID)
DB_LIBS = -L/home/oracle/ora10g/product/10.2.0/db_1/lib -lclntsh -ldl -lm -lpthread
project : dbconn.o funcs.o testEXE
rm -f tp??????dbconn.o: dbconn.pc
$(PROC) $(PROCPARAM) \
INCLUDE=$(CURRINCD) \
INAME=dbconn.pc \
ONAME=dbconn.cc \
$(PCCPFLAGS) \
$(PROCPLSFLAGS)
$(CC) $(CPFLAGS) -o $@ -c dbconn.cc
rm -f dbconn.cc dbconn.lis tp??????funcs.o: funcs.pc
$(PROC) $(PROCPARAM) \
INCLUDE=$(CURRINCD) \
INAME=funcs.pc \
ONAME=funcs.cc \
$(PCCPFLAGS) \
$(PROCPLSFLAGS)
$(CC) $(CPFLAGS) -c funcs.cc -o $@
rm -f funcs.cc funcs.lis tp??????testEXE: funcs.o dbconn.o
$(CC) $(CPFLAGS) -o $@ funcs.o dbconn.o $(DB_LIBS)
rm -f tp*
--------------------------------------------------------------------------------------------
程序也很简单 是为了做测试用的 两个 .pc 文件, 两个头文件,都在当前目录下 编译嚣是\usr\bin\g++32
// implement.h 看过网上网友对这个问题的解决方法 我也把这两个单放一个头文件里定义
#ifndef _IMPLEMENT
#define _IMPLEMENT
EXEC SQL include sqlca;
EXEC SQL include oraca;
#endif
-------------------------------------------------------------------------------------
// comm.h 引入了 implement.h
EXEC SQL include "implement.h";EXEC SQL BEGIN DECLARE SECTION;
typedef struct st_actioninfo
{
char acttype[ 2 + 1 ];
char actioncode[ 2 + 1 ];
char rspcode[ 2 + 1 ];
long priority;
long actiondesc[ 128 + 1 ];
long multilangvarcode[ 20 + 1 ];
}ST_ACTIONINFO;
typedef struct st_actioninfo_s
{
short acttype;
short actioncode;
short rspcode;
short priority;
short actiondesc;
short multilangvarcode;
}ST_ACTIONINFO_S;
EXEC SQL END DECLARE SECTION;
int query_tbl( int );
----------------------------------------------------------------------
// dbconn.pc 主函数 调一个查询数据库记录的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL INCLUDE "comm.h";
#define SQLCODE sqlca.sqlcodeint openDB( char *username, char *passwd )
{
EXEC SQL BEGIN DECLARE SECTION;
long recnum = 0;
char user[ 10 ];
char paswd[ 10 ];
EXEC SQL END DECLARE SECTION;
int ret;
memset( user, 0, sizeof( user ) );
memset( paswd, 0, sizeof( paswd ) );
strcpy( user, username );
strcpy( paswd, passwd ); EXEC SQL CONNECT :user IDENTIFIED by :paswd;
if( SQLCODE<0 )
{
printf( "DB Connect failed sqlcode[%d]!\n", SQLCODE );
return (-1);
}
else
{
printf( "DB Connect OK!\n" );
ret = query_tbl( 1 );
}
return 0;
}
int main( int argc, char **argv )
{
int ret;
ret = openDB( argv[1], argv[2] );
if( ret < 0 )
{
printf(" openDB failed \n" );
return -1;
}
return 0;
}-------------------------------------------------------------------------------
// funcs.pc 只有一个查询并显示的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL INCLUDE "comm.h";
int query_tbl( int rownum )
{
EXEC SQL BEGIN DECLARE SECTION;
int rownum_t;
ST_ACTIONINFO s_actioninfo;
ST_ACTIONINFO_S s_actioninfo_s;
EXEC SQL END DECLARE SECTION;
rownum_t = rownum;
EXEC SQL SELECT * INTO :s_actioninfo:s_actioninfo_s
FROM actioninfo WHERE rownum= :rownum_t;
printf( "---------Table terminfo has record------------\n" );
printf( "acttype [%s]\n", s_actioninfo.acttype );
printf( "actioncode [%s]\n", s_actioninfo.actioncode );
printf( "rspcode [%s]\n", s_actioninfo.rspcode );
printf( "priority [%d]\n", s_actioninfo.priority );
printf( "actiondesc [%s]\n", s_actioninfo.actiondesc );
printf( "multilangvarcode [%s]\n", s_actioninfo.multilangvarcode );
return 0;
}
--------------------------------------------------------------------------------------
应该不会有头文件重复定义的情况了,但编译结果却是:
dbconn.o(.bss+0x0): In function `openDB(char*, char*)':
/home/mdv2ref/priv/jerry/cpptest/dbtest/src/dbconn.pc:15: multiple definition of `sqlca'
funcs.o(.bss+0x0):/home/mdv2ref/priv/jerry/cpptest/dbtest/src/funcs.pc:12: first defined here
dbconn.o(.bss+0xa0): In function `openDB(char*, char*)':
/home/mdv2ref/priv/jerry/cpptest/dbtest/src/dbconn.pc:36: multiple definition of `oraca'
funcs.o(.bss+0xa0):/home/mdv2ref/priv/jerry/cpptest/dbtest/src/funcs.pc:21: first defined here
collect2: ld returned 1 exit status
make: *** [testEXE] Error 1所有方法都试过了 不行 , 请高手们帮忙看看是什么原因, 如果可以 你们氢这些代码在你们的环境编一下 给我一个解决方案,这是全整的代码。 谢谢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货