Oracle 10g → Oracle 19c 升级后问题解决方案(Pro*C 项目)
1️⃣ 升级背景
旧环境:Oracle 10g + gcc 3.x → 支持隐式函数声明
新环境:Oracle 19c + gcc ≥ 5.x → 遵循 C99/C11 标准,禁止隐式函数声明
升级后主要问题:
implicit declaration of function 'sqlcxt'
等错误动态库找不到(运行时报错
libclntsh.so
)Pro*C 生成的
.c
文件缺少头文件
2️⃣ 升级流程建议
步骤 1:环境准备
安装 Oracle 19c Client / Database
安装新的 gcc 版本(≥5.x)
设置环境变量:
export ORACLE_HOME=/opt/oracle/19c/client
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
步骤 2:验证动态库路径
echo $LD_LIBRARY_PATH
ldd ./your_program # 检查 .so 文件是否可找到
步骤 3:Pro*C 文件处理
确认所有
.pc
文件在生成.c
文件时包含必要的头文件:
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlcpr;
或在 Makefile
proc
命令中加 include 参数:
PROCFLAGS = userid=$(USER_ID) mode=oracle sqlcheck=full dbms=native include=$ORACLE_HOME/precomp/public
步骤 4:编译问题处理(implicit declaration)
方法 A:推荐(修复头文件)
在生成的
.c
文件开头加:
#include <sqlca.h>
#include <sqlcpr.h>
#include <oci.h> // 如果使用 OCI 函数
方法 B:临时编译参数(过渡)
在 Makefile 中加入:
CFLAGS += -Wno-implicit-function-declaration
CFLAGS += -std=gnu89 # 可选
⚠️ 没有修复头文件可能导致运行时问题
步骤 5:gcc 版本控制
在 Makefile 指定:
CC = gcc-3 # 或者 gcc-9
CFLAGS = -m32 -O2 -I.
或临时修改 PATH:
export PATH=/opt/gcc-3/bin:$PATH
小结
问题 | 解决方法 |
---|---|
implicit declaration of function | 修复 .c 头文件或 Makefile 增加 include,临时可加 -Wno-implicit-function-declaration |
找不到动态库 | 设置 LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH |
Pro*C 生成 .c 文件缺少头文件 | 在 .pc 文件里加 EXEC SQL INCLUDE sqlca; sqlcpr; 或 Makefile proc include |
gcc 版本差异 | Makefile 指定 CC=gcc-x 或临时修改 PATH |