2013-08-27 102 views
2

我正在使用MSVC Ultimate 2012的Windows Server 2008 R2 Standard(SP1)。我試圖爲64位平臺編譯一個我的「C」項目(但似乎問題與目標無關) 。該項目包含一個* .pc文件,該文件必須由Pro * C/C++預編譯器預編譯。問題是,我無法預編譯該文件。 解析windows.h頭文件時預編譯失敗。請幫忙!!!爲什麼Pro * C/C++ Oracle預編譯器無法解析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)錯誤消息:錯誤消息預編譯期間接收到的是否存在限定= _WIN64在my.cfg文件涉及

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)錯誤消息:預編譯期間接收錯誤消息如果限定= _WIN64不參與在my.cfg文件:

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

再次大家好!我可以看到我的問題還沒有迴應。 :-(好吧,有人可以重複我的嘗試,只是嘗試預編譯一個.pc文件只有一行:#include ?我想知道如果解析的Windows.h頭文件將失敗或不。 ! – Daniel

回答

1

一般問題是Oracle 11 Pro * C的ANSI-C解析能力非常有限。

基本上,Oracle宣稱Pro * C能夠解析ANSI-C源文件時撒謊。

例如,它甚至不能解析的東西,如:

  • for (int i=0; i<n; ++i)
  • C99風格結構/數組的初始化是比簡單的= {0}
  • 臨時初始分配
  • 更復雜一點點
  • ...

因此,人們有以下選擇運行到語法錯誤,NS,當像上述:

  • 報告這是錯誤到Oracle
  • 變通辦法,通過
    • 重構你的代碼使所有windows.h相關的代碼是在自己的非。 PC翻譯單元,其提供了可以安全地從.PC文件中調用的函數 - 或 -
    • 守衛#include <windows.h>指令和所有它的用途與C預處理器條件結構等#ifndef ORA_PROC#endif - 所述ORA_PROC宏爲鄰當文件由Pro * C預處理時,而不是在C編譯器編譯生成的文件時定義 - 或 - 用Pro * C選項PARSE=PARTIALPARSE=NONE(默認值爲PARSE = FULL)進行試驗 - 請注意,這使得esql聲明節是強制性的(並且可能還抑制其他有用的警告) - 或 -
    • 查看windows.h並查找可能默認提供的一些系統宏集合(但不是由Pro * C提供)而這將使得PRO * C開心的時候通過PRO * C DEFINE=選項中提供