2

MSVC Ultimate 2012 を使用して、Windows Server 2008 R2 Standard (SP1) で作業しています。「C」プロジェクトを 64 ビット プラットフォーム用にコンパイルしようとしています (ただし、問題はターゲットに関連していないようです)。プロジェクトには *.pc ファイルが 1 つ含まれており、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\共有、$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) エラー メッセージ: define=_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 に関連するものなど、マクロに混乱がある可能性がありますか? または、構成ファイルに別のマクロを追加する必要がありますか? 私はたくさんの議論を読みましたが、進展はありません。どんなアイデアでも大歓迎です!

4

1 に答える 1

1

一般的な問題は、Oracle 11 Pro*C の ANSI-C 解析機能がかなり制限されていることです。

基本的に、Pro*C が ANSI-C ソース ファイルを解析できると主張するとき、Oracle は嘘をついています。

たとえば、次のようなものを解析することさえできません。

  • for (int i=0; i<n; ++i)
  • 単純なものよりも少し洗練された C99 スタイルの構造体/配列の初期化= {0}
  • 一時的な初期化子の割り当て
  • ...

したがって、上記のような解析エラーが発生した場合は、次のオプションがあります。

  • オラクルにバグとして報告する
  • それを回避する
    • 関連するすべてのwindows.hコードが、.pc ファイルから安全に呼び出すことができる関数を提供する独自の非 .pc 変換単位に含まれるようにコードをリファクタリングする - または -
    • ディレクティブと、および#include <windows.h>のような C プリプロセッサ条件構造でのそのすべての使用を保護する-マクロは、生成されたファイルを C コンパイラがコンパイルするときではなく、ファイルが Pro*C によって前処理されるときにのみ定義される - または -#ifndef ORA_PROC#endifORA_PROC
    • Pro*C オプションを試す、PARSE=PARTIALまたはPARSE=NONE(デフォルトは PARSE=FULL) - これにより、esql 宣言セクションが必須になることに注意してください (おそらく、他の有用な警告も抑制されます) - または -
    • windows.h標準 C コンパイラ (ただし Pro*C では提供されない) でデフォルトで提供され、Pro*CDEFINE=オプションを介して提供された場合に Pro*C を満足させるシステム マクロのセットを調べて見つける。
于 2013-09-14T09:13:20.973 に答える