为什么gcc会偷懒

发布于 2022-09-21 01:29:56 字数 144 浏览 26 评论 0

一份程序,在linux 以及freeebsd下面编译运行都没有问题,拿到mingw下编译就会出错,gcc的版本是相同的,最后发现是在预编译阶段,mingw上的gcc对t头文件中宏定义的替换不够彻底,结果编译程序的时候,不是死在预编译阶段就是死在编译阶段了。怀疑是参数的问题,不知道哪位知道

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

诗笺 2022-09-28 01:29:56

程序长不长?不长的话就贴出来

怕倦 2022-09-28 01:29:56

好几个文件,很长。主要是几个头文件。

眉目亦如画i 2022-09-28 01:29:56

我也是耐着心,整了一天,才发现了问题的所在。

梦归所梦 2022-09-28 01:29:56

把Makefile贴出来吧

叹倦 2022-09-28 01:29:56

老大,你很执着呀。我的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下都没有问题的。

所有深爱都是秘密 2022-09-28 01:29:56

make结果长什么样子?

仙女 2022-09-28 01:29:56

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

老街孤人 2022-09-28 01:29:56

用gcc -E处理了那个报错的头文件,发现是错误出现在这个样一条语句:
extern DLLIMPORT ErrorContextCallback *error_context_stack;
其中DLLIMPORT 是一个宏,最终是要替换成空格的,而 ErrorContextCallback这个宏是 应该被替换成int *。结果gcc居然无动于衷,所以编译器报错,说在*这个符号之前应该出现一个,;=等等的符号,结果却没有遇见。。。。。。。。。。。。。。。。。。。。。我很无语,在Linux以及freebsd的下面是没有这样的问题的。

[ 本帖最后由 rsuhkoi 于 2008-9-1 20:18 编辑 ]

梦幻之岛 2022-09-28 01:29:56

原帖由 rsuhkoi 于 2008-9-1 20:13 发表
用gcc -E处理了那个报错的头文件,发现是错误出现在这个样一条语句:
extern DLLIMPORT ErrorContextCallback *error_context_stack;
其中DLLIMPORT 是一个宏,最终是要替换成空格的,而 ErrorContextCallbac ...

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文