我现在用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所有方法都试过了  不行 , 请高手们帮忙看看是什么原因,  如果可以 你们氢这些代码在你们的环境编一下 给我一个解决方案,这是全整的代码。 谢谢!