【问题标题】:Oracle's pro*C compiler and gnu C (__builtin_va_list, __attribute__, etc)Oracle 的 pro*C 编译器和 gnu C(__builtin_va_list、__attribute__ 等)
【发布时间】:2010-03-18 02:19:57
【问题描述】:

我正在用 proC 编译一个数据库库,它将 .ppc 库文件转换为 gcc 可以使用的 .c 文件。但是,我在 proC 中遇到了很多错误,如下所示

   PCC-S-02201, Encountered the symbol
"__ attribute__ " when expecting one of
the `following`

... 

   , Encountered the symbol
"__builtin_va_list" when expecting one of
the `following`

缺少的符号来自标准链,包括 stdio.h 和 stdlib.h。我该如何解决这个问题?

我正在编译的库来自我们现在正在升级的旧 solaris 系统(升级到新的 solaris 10 系统),并且头文件似乎没有使用这些符号。例如较新的 .h 文件有

typedef __builtin_va_list va_list

而旧的 .h 文件有

typedef void* va_list

有很多这样的事情,所以我不愿意去用 typedef 手动修复所有这些

【问题讨论】:

  • 您是否尝试在 pro*C 中编译来自 gcc 的库头文件,反之亦然?

标签: c oracle compilation gnu oracle-pro-c


【解决方案1】:

$ORACLE_HOME/precomp/admin/pcscfg.cfg 中的 PARSE 参数更改为 PARTIAL - 它将使用更宽松的 C 解析,因此 Pro*C 不会对它不理解的 C 语法发脾气。

【讨论】:

    【解决方案2】:

    您也可以通过包含此预处理器指令来实现它。 Pro*C 评估宏并替换它们

    #ifdef ORA_PROC
    #define __attribute__(x) 
    #endif
    

    我实际上是在家,无法准确验证它在我们的代码库中是如何定义的,我会检查并完成它,但它就像上面一样。

    更新:所以我们在项目中使用的确切代码是:

    #if defined(ORA_PROC) || !defined(__GNUC__)
    #define __attribute__(x)
    typedef unsigned long long uint64_t;
    typedef          long long  int64_t;
    #define INLINE
    #endif
    

    由于未知原因,预处理器无法定义 64 位类型,所以我直接定义它们以便它工作。 我们的项目在 Solaris 9 for SPARC 上,我们使用 GCC 3.3.1 和 GCC 3.4.2 进行编译,我们使用 Oracle 10g

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多