红联Linux门户
Linux帮助

如何把unix 下的c程序移植到suse linux下,编译出错?

发布时间:2009-08-20 15:34:26来源:红联作者:yang__guo
我把UNIX下的c程序,搬到suse linux 10 下,运行make,结果报错(而且有乱码),请各位大虾帮看下,谢谢!
报错err.c 的部分:
#include
#include
#include
#include
#include
#include
/* [2] begin */
#include
FILE *gfp_out = stdout; 这句报错
/* [2] end */


make -f arch.mk的结果如下:
[Linux:/home/eam/src/arch]make -f arch.mk
/usr/bin/cc -c -g -I. -DARCH_DEBUG -I/home/eam/include/arch -I/home/eam/include/arch -o /home/eam/lib/err.o err.c
err.c:45: error: initializer element is not constant
err.c:48:25: error: sys/varargs.h: No such file or directory
err.c: In function ??rr_set_info??
err.c:147: error: invalid use of void expression
err.c:147: warning: second parameter of ??a_start??not last named argument
err.c: In function ??rr_append_info??
err.c:224: error: invalid use of void expression
err.c:224: warning: second parameter of ??a_start??not last named argument
err.c: At top level:
err.c:683: error: static declaration of ??et_std_msg??follows non-static declaration
err.c:312: error: previous implicit declaration of ??et_std_msg??was here
err.c:747: error: static declaration of ??et_hdl_sug??follows non-static declaration
err.c:604: error: previous implicit declaration of ??et_hdl_sug??was here
err.c:821: error: static declaration of ??oad_std_msg_file??follows non-static declaration
err.c:701: error: previous implicit declaration of ??oad_std_msg_file??was here
err.c:970: error: static declaration of ??oad_hdl_sug_file??follows non-static declaration
err.c:765: error: previous implicit declaration of ??oad_hdl_sug_file??was here
make: *** [/home/eam/lib/err.o] Error 1
[Linux:/home/eam/src/arch]
文章评论

共有 8 条评论

  1. yang__guo 于 2009-08-27 08:58:48发表:

    我编译完后,运行程序,结果 报:Segmentation fault
    但我整个用户下面和/tmp下都查了,没有发现core文件啊
    应该怎么处理,程序运行不了,也没的查啊

    请高手帮忙解答下,万分感谢!!!

  2. yang__guo 于 2009-08-26 11:55:03发表:

    我编译完后,运行程序,结果 报:Segmentation fault
    但我整个用户下面和/tmp下都查了,没有发现core文件啊
    应该怎么处理,程序运行不了,也没的查啊

    请高手帮忙解答下,万分感谢!!!

  3. hspwan 于 2009-08-25 09:14:28发表:

    好好,谢谢

  4. yang__guo 于 2009-08-21 20:38:34发表:

    终于编译通过,非常感谢!

    linux 的 c 编译器检查规则比 unix 严格多了,从unix移植过来的程序waring非常多,
    使用strlen(),memcpy(),等函数,文件需要加上include ,这点在unix不需要的
    表达式的两边的类型一定要一致,不一致时,需要强行类型转换。。。 。。。

  5. tianyuan008 于 2009-08-21 17:26:38发表:

    [i=s] 本帖最后由 tianyuan008 于 2009-8-21 17:33 编辑 [/i]

    1.FILE * .. 应该移到函数里面,放到全局域里 stdout 是不确定的.
    2. get_std_msg 函数的定义应该放到 err_set_info 函数的前面, 你没有声明 get_std_msg 函数就使用它了, 这种古老的编译器才接受的语法在现在是不能用的

  6. yang__guo 于 2009-08-21 16:32:29发表:

    有高手解答一下不,非常感谢啊

  7. yang__guo 于 2009-08-21 09:27:47发表:

    2# tianyuan008


    谢谢!
    我的err。c的部分源代码:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    FILE *gfp_out = stdout;---------------------第45行:报:err.c:45: error: initializer element is not constant
    #include

    。。。 。。。
    int err_set_info( char * ps_error_type,
    int i_error_no,
    int i_severity,
    char * ps_file,
    long l_line,
    char * ps_dtl_msg_fmt,
    ...
    )
    {

    va_list ap;
    char s_detail_msg[ MX_ERR_DTL_MSG_LEN + 1 ];

    /*va_start( ap,(void) ps_dtl_msg_fmt );*/
    va_start( ap, ps_dtl_msg_fmt );
    vsprintf( s_detail_msg, ps_dtl_msg_fmt, ap );
    va_end( ap );
    。。。 。。。
    switch( l_err_type ) {

    case ETYPE_CD_OPSYS:

    err_opsys_msg ( r_err_info_struct.i_error_no,
    r_err_info_struct.s_standard_msg );
    break;

    case ETYPE_CD_ORACLE:

    err_sql_msg ( r_err_info_struct.s_standard_msg );
    break;

    default:

    i_ret_cd = get_std_msg( l_err_type ,------------------第314行,报:err.c:314: error: previous implicit declaration of ??et_std_msg??was here
    r_err_info_struct.i_error_no ,
    r_err_info_struct.s_standard_msg );
    break;


    } /* end switch */

    。。。 。。。
    static int get_std_msg( long l_err_type ,
    long l_err_no ,
    char * ps_std_msg )
    {--------------------第685行:报:err.c:685: error: static declaration of ??et_std_msg??follows non-static declaration,且有乱码??

    。。。 。。。
    }

    现在编译后,报错信息:
    [Linux:/home/eam/src/arch]make -f arch.mk
    /usr/bin/cc -c -g -I. -DARCH_DEBUG -I/home/eam/include/arch -I/home/eam/include/arch -o /home/eam/lib/err.o err.c
    err.c:45: error: initializer element is not constant
    err.c:685: error: static declaration of ??et_std_msg??follows non-static declaration
    err.c:314: error: previous implicit declaration of ??et_std_msg??was here
    err.c:749: error: static declaration of ??et_hdl_sug??follows non-static declaration
    err.c:606: error: previous implicit declaration of ??et_hdl_sug??was here
    err.c:823: error: static declaration of ??oad_std_msg_file??follows non-static declaration
    err.c:703: error: previous implicit declaration of ??oad_std_msg_file??was here
    err.c:972: error: static declaration of ??oad_hdl_sug_file??follows non-static declaration
    err.c:767: error: previous implicit declaration of ??oad_hdl_sug_file??was here
    make: *** [/home/eam/lib/err.o] Error 1
    [Linux:/home/eam/src/arch]


    麻烦大虾帮忙解决,非常感谢!
    主要问题是,
    1、error: initializer element is not constant
    2、定义的静态函数报错

  8. tianyuan008 于 2009-08-20 19:31:32发表:

    [i=s] 本帖最后由 tianyuan008 于 2009-8-20 19:41 编辑 [/i]

    没看见代码

    另外 varargs.h 不是标准头文件,请用跨平台的 stdarg.h 并修改相应代码