如何在Linux上编译一个在Solaris上编译和运行良好的'C'应用程序?



我正试图在Linux上编译和运行一个在Solaris上运行良好的"C"应用程序。我最初尝试只复制在Solaris上编译并在Linux上运行的二进制文件,但这给了我一个错误,说cannot execute binary file。因此,我首先尝试使用在Solaris上编译代码时使用的Makefile在Linux上编译代码。Makefile的内容如下:

PROC=$(ORACLE_HOME)/bin/proc
CFLAGS:=$(CFLAGS) -DSOLARIS
PROCFLAGS:=$(PROCFLAGS) -DSOLARIS
HEADERS= $(HOME)
target = $(HOME)
CC=gcc
%.c :%.ec ; $(PROC) $(PROCFLAGS) 
INCLUDE=/usr/topendurc/inc 
iname=$< oname=$(@F)
%.o :%.c ; $(CC) -I$(HEADERS) -DORA_PROC -c $(CFLAGS) 
-L /usr/local/lib -L ./ -I /usr/local/include $<

MAKEC= mv $(target)/$(@F) $(target)/$(@F).old; 
$(CC) $(CFLAGS) -lnsl -lsocket -lm  $^ -L $(target) 
-L $(ORACLE_HOME)/lib -l clntsh 
-o $(target)/$(@F)
$(target)/%:%.o  $(CLIBFILES); $(MAKEC)
%:%.o  $(CLIBFILES); $(MAKEC)
all: rm_interface clean
rm_interface: lrfunc.o tcp.o trace.o global.o rmi.o license.o purge.o fetch_data.o
clean:
-rm lrfunc.o tcp.o trace.o global.o rmi.o purge.o license.o fetch_data.o trace.c global.c rmi.c

通过使用上面的Makefile,我在下面提到的代码中得到了错误:

gcc -I/home/dev1o -DORA_PROC -c  -DSOLARIS 
-L /usr/local/lib -L ./ -I /usr/local/include global.c
/home/oracle/oracle/product/10.2.0/db_1/bin/proc  -DSOLARIS 
INCLUDE=/usr/topendurc/inc 
iname=rmi.ec oname=rmi.c
Pro*C/C++: Release 10.2.0.1.0 - Production on Thu Jan 16 13:19:57 2014
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
System default option values taken from:     /home/oracle/oracle/product/10.2.0/db_1/precomp/admin/pcscfg.cfg
make: *** [rmi.c] Segmentation fault
make: *** Waiting for unfinished jobs....
global.c: In function `timeout_timer':
global.c:556: error: invalid application of `sizeof' to incomplete type `itimerval'
global.c:558: error: dereferencing pointer to incomplete type
global.c:559: error: dereferencing pointer to incomplete type
global.c:561: error: dereferencing pointer to incomplete type
global.c:562: error: dereferencing pointer to incomplete type
global.c:564: error: `ITIMER_REAL' undeclared (first use in this function)
global.c:564: error: (Each undeclared identifier is reported only once
global.c:564: error: for each function it appears in.)
make: *** [global.o] Error 1

更新:后来我在文件global.ec中包含了一个头文件,错误减少到如下:

/home/oracle/oracle/product/10.2.0/db_1/bin/proc  -DSOLARIS 
INCLUDE=/usr/topendurc/inc 
iname=global.ec oname=global.c
/home/oracle/oracle/product/10.2.0/db_1/bin/proc  -DSOLARIS 
INCLUDE=/usr/topendurc/inc 
iname=rmi.ec oname=rmi.c
Pro*C/C++: Release 10.2.0.1.0 - Production on Thu Jan 16 15:05:26 2014
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
System default option values taken from:     /home/oracle/oracle/product/10.2.0/db_1/precomp/admin/pcscfg.cfg
make: *** [global.c] Segmentation fault
make: *** Waiting for unfinished jobs....
Pro*C/C++: Release 10.2.0.1.0 - Production on Thu Jan 16 15:05:26 2014
Copyright (c) 1982, 2007, Oracle.  All rights reserved.

System default option values taken from:     /home/oracle/oracle/product/10.2.0/db_1/precomp/admin/pcscfg.cfg
make: *** [rmi.c] Segmentation fault

注意:错误报告在.c文件中,但它们实际上是.ec文件。

global.ec的简化版本

#ifdef ORA_PROC
#include "xxxoracle.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <libgen.h>
#include <string.h>
#include <stropts.h>
#include <sys/time.h>
#include <ctype.h>
#include <signal.h>
#include <unistd.h> 
EXEC SQL INCLUDE sqlca;
#define MILLION 1000000
/*connect to oracle database */ 
int
access_database(void)
{   
char str[200]="";
EXEC SQL BEGIN DECLARE SECTION;
char ospasswd = '/';
char dbname[40];
EXEC SQL END DECLARE SECTION;

if (getenv("DBNAME") != 0)
strcpy (dbname, (char *) getenv("DBNAME"));
else
{
trace("Error ENV variable DBNAME not defined");
return(1);
}
#ifdef ORA_PROC
if (strlen(dbname) == strcspn(dbname, "/"))
/* connect to database using Unix/OS password*/
EXEC SQL connect :ospasswd using :dbname;
else
EXEC SQL connect :dbname;
EXEC SQL ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDDHH24MISS';
#endif
if (sqlca.sqlcode)
{
sprintf(str, "access_database(): Error connecting to database");
return(1);
}
else
{
sprintf(str, "access_database(): Connecting to database");
}
return(0);
}

有人在这里提出了类似的问题,得到的回答是使用GNU Autoconf。但我觉得,在我的情况下,Makefile中的一些更改或添加一些丢失的头文件可以使它在Solaris上正常工作。我还在StackOverflow上发现了一篇类似的帖子,人们建议使用像GDB这样的调试器。在我的情况下使用GDB会有帮助吗?

请帮帮我,因为我对这件事还很陌生。

使用GDB没有帮助。您的make进程在尝试创建目标文件global.c时遇到"分段错误"。Makefile的同一目录中的任何*.ec文件都将用于通过使用Pro*C工具(如Makefile所规定)创建相应的*.c文件。构建rm_interface的这个阶段肯定是失败的。最有可能的是,global.c文件没有创建,或者格式不正确,这意味着您将不具备构建最终可执行文件所需的先决条件,这意味着您没有任何东西可以使用GDB进行调试。您需要找出Pro*C工具无法使用以下命令从global.ec创建global.c的原因:

/home/oracle/oracle/product/10.2.0/db_1/bin/proc  -DSOLARIS 
INCLUDE=/usr/topendurc/inc 
iname=global.ec oname=global.c

要对此进行调查,请使用原始问题的评论中列出的建议:

  • 删除ShinTakezou建议的-DSOLARIS,或者替换为更合适的-DLINUX
  • 熟悉Pro*C工具及其选项/参数:ProC/C++程序员指南

相关内容

  • 没有找到相关文章

最新更新