我正在使用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~1\Micros~2.0\VC\include,c:\Progra~2\WI3CF2~1\8.0\Include\um,c:\Progra~2\WI3CF2~1\8.0\Include\shared,$PROC11_ORACLE_HOME\PRECOMP\PUBLIc)
sqlcheck=full
parse=FULL
define=_WIN64 (or without this line)
注意:d:\ Progra~1 \ Micros~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 \ Include \ um,c:\ Progra~2 \ WI3CF2~1 \ 8.0 \ Include \ shared = C:\ Program Files(x86)\ Windows Kits \ 8.0 \ Include \ shared,$ PROC11_ORACLE_HOME = d:\ oracle \ product \ 11.2.0 \ client_2。这些路径可以找到所有需要的头文件。
3)命令行:我在自定义构建工具/常规选项中为my.pc文件定义了以下命令行:
$(PROC11_ORACLE_HOME)\bin\proc config=.\my.cfg iname=%(Filename).pc oname=.\%(Filename).c include="$(MSDEV_HOME)\vc\include".
注意:$(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~1\Micros~2.0\VC\include\vadefs.h:
1> Error at line 46, column 1 in file d:\Progra~1\Micros~2.0\VC\include\vadefs.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~1\Micros~2.0\VC\include\vadefs.h:
1> Error at line 48, column 1 in file d:\Progra~1\Micros~2.0\VC\include\vadefs.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相关的东西?或者我应该在配置文件中添加另一个宏?我已经阅读了大量讨论但没有进展。任何想法都将非常感激!
答案 0 :(得分:1)
一般问题是Oracle 11 Pro * C的ANSI-C解析功能非常有限。
基本上,当声称Pro * C能够解析ANSI-C源文件时,Oracle就撒谎了。
例如,它甚至无法解析像:
这样的东西for (int i=0; i<n; ++i)
= {0}
更复杂因此,当遇到如上所述的解析错误时,会有以下选项:
windows.h
相关代码都在其自己的非.pc转换单元中,该单元提供可以从.pc文件安全调用的函数 - 或 - #include <windows.h>
和#ifndef ORA_PROC
等C预处理器条件结构保护#endif
指令及其所有用途 - ORA_PROC
宏仅在文件为由Pro * C预处理,而不是在C编译器编译生成的文件时 - 或 - PARSE=PARTIAL
或PARSE=NONE
(默认值为PARSE = FULL) - 请注意,这会使esql声明部分成为必需(并且可能还会抑制其他有用的警告) - 或 - windows.h
并查找默认情况下使用标准C编译器(但不是Pro * C)提供的一些系统宏,这些将使Pro * C在通过Pro *提供时感到高兴C DEFINE=
选项