charleschchen
作者charleschchen·2022-06-08 11:40
系统架构师·浪潮商用机器有限公司

DB2 嵌入式 SQL(SQC) 编译问题分析

字数 914阅读 1903评论 0赞 1

问题描述

某客户反馈,在其中一套开发环境编译存在如下报错(说明:出于信息安全考虑,相关代码均使用测试代码模拟,请勿对号入座):

"test.c", line 10.5: 1506-343 (S) Redeclaration of IsSpecialType differs from previous declaration on line 9 of "test.c".

"test.c", line 10.5: 1506-050 (I) Return type "short" in redeclaration is not compatible with the previous return type "char".

"test.c", line 10.5: 1506-377 (I) The type "double" of parameter 1 differs from the previous type "void*".

同样代码在其他开发环境不存在报错。

问题分析

从直接报错提示信息看,该文件用到了 C++ 语法(函数重载),但是该文件名后缀为 .c ,默认使用 C 语言规则编译,所以会报错,涉及代码如下:

char IsSpecialType(void*);

short IsSpecialType(double);

检查用户编译文件发现,该 C 文件 (test.sqc) 由 db2 预处理 sqc 文件生成:

对 sqC 文件进行处理得到后缀为 .C 的文件;

对 sqc 文件处理得到后缀为 .c 的文件;

进一步排查,问题环境涉及到的三个 sqC 后缀文件被错误拷贝为 sqc 后缀文件(注意大小写差异),但其中两个同时拷贝了 *.o 文件。而 makefile 语法只在 sqc 文件更新的情况下会调用编译逻辑,否则如果已经存在相应的 .o 文件,不需要编译,就不会报错。因此报错只涉及 test.sqc/test.c.

其他编译正常的环境要么正确拷贝了 sqC 后缀文件,要么同时拷贝了全部 *.o 文件,因此不会报错。

据上述分析,将 test.sqc 文件名更正为 test.sqC ,编译即恢复正常。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广