Chinaunix

标题: 为什么gcc会偷懒 [打印本页]

作者: rsuhkoi    时间: 2008-08-31 18:27
标题: 为什么gcc会偷懒
一份程序,在linux 以及freeebsd下面编译运行都没有问题,拿到mingw下编译就会出错,gcc的版本是相同的,最后发现是在预编译阶段,mingw上的gcc对t头文件中宏定义的替换不够彻底,结果编译程序的时候,不是死在预编译阶段就是死在编译阶段了。怀疑是参数的问题,不知道哪位知道
作者: cjaizss    时间: 2008-08-31 19:05
程序长不长?不长的话就贴出来
作者: rsuhkoi    时间: 2008-08-31 21:13
标题: 回复 #2 cjaizss 的帖子
好几个文件,很长。主要是几个头文件。
作者: rsuhkoi    时间: 2008-08-31 21:14
标题: 回复 #2 cjaizss 的帖子
我也是耐着心,整了一天,才发现了问题的所在。
作者: cjaizss    时间: 2008-08-31 22:08
把Makefile贴出来吧
作者: rsuhkoi    时间: 2008-09-01 12:57
标题: 回复 #5 cjaizss 的帖子
老大,你很执着呀。我的makfile很简单的:
include ../../Makefile.dqp

#设置库等环境变量值
PG_DIR=${DQP_DIR}/bin
PG_INCLUDE=../include
PG_LIB=${PG_DIR}/lib

#设置编译的标志
CC = gcc

CFLAG=   -fPIC -w  -g -shared

PG_CFLAGS=-I${PG_INCLUDE} -L${PG_LIB}  

DCFLAGS= ${CFLAG} ${PG_CFLAGS} -o

#OBJ = .o        # .o , .obj
#WrapperFun_Obj = IgniteWrapperFun${OBJ}

DLLLIB = .dll        # .dll , .so
WrapperFun_Dll = libignite_wrapper_libpqipc${DLLLIB}

AllTasks = clean PgsqlWrapper copy

all{AllTasks}
       
clean:
#        rm -f *${OBJ}
        rm -f *${DLLLIB}
        rm -f ./*.bak

copy:
        cp -f ./${WrapperFun_Dll} ../../bin/lib/${WrapperFun_Dll}
PgsqlWrapper:
        ${CC} ${DCFLAGS} ${WrapperFun_Dll} IgniteWrapperFun.c WrapperFunSocket.c IgniteWrapperFunWork.c  -lc -lrt -ldl -lpostgres -lwsock32
包含的那个makefile.dqp中就只把DQP_DIR设置为了一个目录,没有其他的内容。这个makefile文件在linux freebsd下都没有问题的。
作者: cjaizss    时间: 2008-09-01 15:29
make结果长什么样子?
作者: rsuhkoi    时间: 2008-09-01 20:04
标题: 回复 #7 cjaizss 的帖子
In file included from ../include/postgres.h:49,
                 from WrapperFunCommunication.h:25,
                 from IgniteWrapperFun.c:1:
../include/utils/elog.h:226: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
In file included from ../include/postgres.h:49,
                 from WrapperFunCommunication.h:25,
                 from WrapperFunSocket.c:1:
../include/utils/elog.h:226: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
In file included from ../include/postgres.h:49,
                 from WrapperFunCommunication.h:25,
                 from IgniteWrapperFunWork.c:1:
../include/utils/elog.h:226: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
make: *** [PgsqlWrapper] Error 1
作者: rsuhkoi    时间: 2008-09-01 20:13
标题: 回复 #7 cjaizss 的帖子
用gcc -E处理了那个报错的头文件,发现是错误出现在这个样一条语句:
extern DLLIMPORT ErrorContextCallback *error_context_stack;
其中DLLIMPORT 是一个宏,最终是要替换成空格的,而 ErrorContextCallback这个宏是 应该被替换成int *。结果gcc居然无动于衷,所以编译器报错,说在*这个符号之前应该出现一个,;=等等的符号,结果却没有遇见。。。。。。。。。。。。。。。。。。。。。我很无语,在Linux以及freebsd的下面是没有这样的问题的。

[ 本帖最后由 rsuhkoi 于 2008-9-1 20:18 编辑 ]
作者: cjaizss    时间: 2008-09-02 08:59
原帖由 rsuhkoi 于 2008-9-1 20:13 发表
用gcc -E处理了那个报错的头文件,发现是错误出现在这个样一条语句:
extern DLLIMPORT ErrorContextCallback *error_context_stack;
其中DLLIMPORT 是一个宏,最终是要替换成空格的,而 ErrorContextCallbac ...

可能是不满足它的编译条件,设计这个工程的人不打算你什么地方都可以编译通过,有些地方他不想让你编译通过。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2