在 Linux 環境下進行 Oracle 資料庫應用開發時,.pc 檔案(包含嵌入式 SQL 的 C 程式)的編譯流程分為兩個關鍵階段:首先使用 proc 預處理器將 .pc 轉換為標準的 .c 檔案,接著再以 gcc 進行編譯連結。本文系統整理 proc 常用參數與 gcc 核心編譯選項,幫助開發者快速排錯並優化建置流程。
執行 proc test.pc 時若報錯,多半是標頭檔或函式庫路徑未正確納入。以下為常用參數對照表:
| 參數 | 功能說明 | 語法範例 | 預設值 | 備註 |
|---|---|---|---|---|
CODE | 指定產生的 C 函式原型格式 | CODE=ANSI_C 產生 extern sqlca(long*, void*)CODE=KR_C 產生 extern sqlca(/*_ long*, void *_/) | KR_C | 命令列或程式碼中均可指定 |
DBMS | 指定目標 Oracle 版本 | DBMS=NATIVE|V6|V7 | NATIVE | 僅限命令列 |
ERRORS | 控制錯誤訊息輸出目的地 | ERRORS=YES(終端+清單)ERRORS=NO(僅清單) | YES | 命令列與程式碼皆可 |
INCLUDE | 指定 EXEC SQL INCLUDE 的搜尋目錄 | INCLUDE=/path/to/headers | — | 僅適用支援目錄的作業系統 |
MODE | 指定程式遵循的 SQL 標準 | MODE=ORACLE|ANSI|ISO | ORACLE | — |
ONAME | 指定輸出檔案完整路徑 | ONAME=/out/dir/test.c | — | — |
LINES | 是否在輸出檔插入 #line 指令 | LINES=YES|NO | NO | 除錯時建議開啟 |
INAME | 指定輸入檔案完整路徑 | INAME=/src/dir/test.pc | — | — |
預處理完成後會產生對應的 .c 檔案,接著進入 gcc 編譯階段。
以下整理開發高頻使用的 gcc 參數,分類說明:
-c:僅執行預處理、編譯、組譯,產出 .o 目標檔(不連結)。範例:gcc -c hello.c-S:僅預處理與編譯,產出 .s 組合語言檔。範例:gcc -S hello.c-E:僅預處理,結果導向標準輸出。範例:gcc -E hello.c > preprocessed.txt-o <file>:指定輸出檔名。範例:gcc -o myapp hello.c-ansi / -std=c89|c99|c11:啟用嚴格 ANSI/ISO 標準,關閉 GNU 延伸特性。-Wall:開啟所有常見警告(強烈建議常開)。-Wextra、-Wpedantic、-Werror:進階警告控制。-Dmacro / -Dmacro=val:等同 #define。-Umacro:取消宏定義(#undef)。-I<dir>:新增標頭檔搜尋目錄(優先級高於系統預設)。-nostdinc:忽略系統標準標頭檔目錄,配合 -I 完全自控搜尋路徑。-include <file>:強制包含指定檔案,效果等同原始碼開頭 #include。-imacros <file>:展開檔案巨集但不輸出檔案內容。-funsigned-char / -fsigned-char:強制 char 為無/有號。-fno-asm:禁用 asm、inline、typeof 關鍵字。-fno-strict-prototype:僅影響 g++,空參數表視為「未指定」而非「無參數」。-M / -MM:輸出完整/忽略系統標頭檔的相依規則。-MD / -MMD:同 -M/-MM 但寫入 .d 檔,配合 include $(wildcard *.d) 實現增量建置。-Wa,option:傳遞選項給組譯器。-Wl,option:傳遞選項給連結器(如 -Wl,-rpath,/opt/lib)。# 1. Pro*C 預處理(含標頭路徑與 ANSI C 風格)
proc iname=src/app.pc oname=build/app.c code=ANSI_C include=/opt/oracle/precomp/public
# 2. GCC 編譯為目標檔(開啟警告、C99 標準、指定 include)
gcc -c -Wall -std=c99 -I/opt/oracle/precomp/public -Ibuild -o build/app.o build/app.c
# 3. 連結生成執行檔(連結 Oracle 客戶端庫)
gcc -o build/app build/app.o -L/opt/oracle/lib -lclntsh -lpthread -lm -ldl
sqlca.h / oratypes.h:確認 $ORACLE_HOME/precomp/public 已加入 -I 路徑。CODE=KR_C 與 C99 混用產生警告:統一改用 CODE=ANSI_C 並搭配 -std=c99。-m64 與 Oracle Instant Client 版本一致性。#line 指令干擾除錯:若 GDB 行號混亂,嘗試 LINES=NO。掌握 proc 參數與 gcc 選項的組合運用,能大幅降低 Oracle Pro*C 專案的建置失敗率。建議將常用參數封裝進 Makefile 或 CMake 腳本,實現一鍵建置與持續整合。