为什么gcc会偷懒
一份程序,在linux 以及freeebsd下面编译运行都没有问题,拿到mingw下编译就会出错,gcc的版本是相同的,最后发现是在预编译阶段,mingw上的gcc对t头文件中宏定义的替换不够彻底,结果编译程序的时候,不是死在预编译阶段就是死在编译阶段了。怀疑是参数的问题,不知道哪位知道
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
程序长不长?不长的话就贴出来
好几个文件,很长。主要是几个头文件。
我也是耐着心,整了一天,才发现了问题的所在。
把Makefile贴出来吧
老大,你很执着呀。我的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下都没有问题的。
make结果长什么样子?
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
用gcc -E处理了那个报错的头文件,发现是错误出现在这个样一条语句:
extern DLLIMPORT ErrorContextCallback *error_context_stack;
其中DLLIMPORT 是一个宏,最终是要替换成空格的,而 ErrorContextCallback这个宏是 应该被替换成int *。结果gcc居然无动于衷,所以编译器报错,说在*这个符号之前应该出现一个,;=等等的符号,结果却没有遇见。。。。。。。。。。。。。。。。。。。。。我很无语,在Linux以及freebsd的下面是没有这样的问题的。
[ 本帖最后由 rsuhkoi 于 2008-9-1 20:18 编辑 ]
可能是不满足它的编译条件,设计这个工程的人不打算你什么地方都可以编译通过,有些地方他不想让你编译通过。