我正在使用MSVC Ultimate 2012开发Windows Server 2008 R2 Standard(SP1)。我正试图为64位平台编译一个我的"C"项目(但问题似乎与目标无关)。该项目包括一个*.pc文件,必须由Pro*C/C++预编译器进行预编译。问题是,我无法预编译该文件。在解析windows.h头文件时,预编译失败。请帮助!!
更多详细信息:
1) 源文件:我的My.pc文件开始如下:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <sqlca.h>
#include <sqlcpr.h>
…..
注意:第一个#include <windows.h>
就足以进行错误调用。
2) 配置文件:默认的pcscfg.cfg文件为空,项目配置文件my.cfg如下所示:
sys_include=(d:Progra~1Micros~2.0VCinclude,c:Progra~2WI3CF2~18.0Includeum,c:Progra~2WI3CF2~18.0Includeshared,$PROC11_ORACLE_HOMEPRECOMPPUBLIc)
sqlcheck=full
parse=FULL
define=_WIN64 (or without this line)
注:d:\Progra~1\Microsoft~2.0\VC\include=d:\Program Files\Microsoft Visual Studio 10.0\VC\include,c:\Progra~2\WI3CF2~1\8.0\include\um=c:\Program Files(x86)\Windows Kits\8.0\Incept\um,c:\Progra ~2\WI3CF2~1\8.0 \include\shared=c:\Program Files(x86。这些路径用于查找所有需要的头文件。
3) 命令行:我在自定义构建工具/常规选项中为my.pc文件定义了以下命令行:
$(PROC11_ORACLE_HOME)binproc config=.my.cfg iname=%(Filename).pc oname=.%(Filename).c include="$(MSDEV_HOME)vcinclude".
注意:$(MSDEV_HOME)=D:\Program Files\Microsoft Visual Studio 10.0。
4) 平台:MSVC平台设置为x64,但我在Win32中也获得了类似的结果。
5) 错误消息:如果my.cfg文件中包含define=_WIN64,则在预编译期间收到错误消息:
1> Syntax error at line 46, column 1, file d:Progra~1Micros~2.0VCincludevadefs.h:
1> Error at line 46, column 1 in file d:Progra~1Micros~2.0VCincludevadefs.h
1> typedef unsigned __int64 uintptr_t;
1> 1
1> **PCC-S-02201, Encountered the symbol "typedef" when expecting one of the following:**
1> ; , = ( [
1> The symbol ";" was substituted for "typedef" to continue.
6) 错误消息:如果my.cfg文件中的define=_WIN64未涉及,则在预编译期间收到错误消息:
1> Syntax error at line 48, column 1, file d:Progra~1Micros~2.0VCincludevadefs.h:
1> Error at line 48, column 1 in file d:Progra~1Micros~2.0VCincludevadefs.h
1> typedef _W64 unsigned int uintptr_t;
1> 1
1> **PCC-S-02201, Encountered the symbol "typedef" when expecting one of the following:**
1> ; , = ( [
7) 文件vadefs.h:vadefs.h头文件中的关键行如下所示:
#ifndef _UINTPTR_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 uintptr_t; (this is line no. 46)
#else
typedef _W64 unsigned int uintptr_t; (this is line no. 48)
#endif
#define _UINTPTR_T_DEFINED
#endif
问题是,为什么在标准的Microsoft头文件中预编译失败。宏中可能存在一些混乱,例如与_WIN64有关的内容?还是应该在配置文件中添加另一个宏?我读了很多讨论,但没有取得进展。任何想法都将不胜感激!
一般问题是Oracle 11 Pro*C的ANSI-C解析能力非常有限。
基本上,Oracle声称Pro*C能够解析ANSI-C源文件是在撒谎。
例如,它甚至不能解析以下内容:
for (int i=0; i<n; ++i)
- C99风格的结构/数组初始化比简单的
= {0}
稍微复杂一点 - 临时初始值设定项赋值
因此,当遇到如上所述的解析错误时,有以下选项:
- 将其作为错误报告给Oracle
- 解决方法,通过
- 重构代码,使所有与
windows.h
相关的代码都在其自己的非.pc翻译单元中,该单元提供可以从.pc文件安全调用的函数,或者- - 用C预处理器条件结构(如
#ifndef ORA_PROC
和#endif
)保护#include <windows.h>
指令及其所有使用-仅当Pro*C预处理文件时才定义ORA_PROC
宏,而不是当C编译器编译生成的文件时-或- - 尝试Pro*C选项
PARSE=PARTIAL
或PARSE=NONE
(默认值为PARSE=FULL)-请注意,这使得esql声明部分是强制性的(可能还会抑制其他有用的警告)-或- - 查看
windows.h
,并找到一些系统宏集,这些宏集默认由标准C编译器提供(但不是由Pro*C提供),并且当通过Pro*CDEFINE=
选项提供时,会让Pro*C感到满意
- 重构代码,使所有与