將 .pc 經 proc.exe 編譯為 .cpp 加入 C++Builder 項目後,鏈接階段報錯:
[Linker Error] Unresolved external '_sqlcxt' referenced from ... DB_CON.OBJ
Oracle 客戶端庫 (OCI) 的導入庫 (.lib) 未被正確鏈接,或庫路徑/名稱不匹配。 _sqlcxt 是 Pro*C 運行時調用 OCI 核心函數的入口符號,定義于 orasql*.lib / oci.lib 中。
orasql12.lib、oci.lib(路徑通常在 ORACLE_HOME\bin 或 ORACLE_HOME\lib)。implib.exe 從 DLL 生成 .lib 時,**必須確保 DLL 位元數與項目目標平台一致**。Project → Options → Linker:
C:\app\client\product\12.1.0\client_1\lib)。orasql12.lib oci.lib(版本號根據安裝的 Oracle Client 確定)。在 Pro*C 生成的 .cpp 或公共頭文件頂部添加:
#pragma comment(lib, "orasql12.lib")
#pragma comment(lib, "oci.lib")
// 若庫不在系統路徑,需指定全路徑:
// #pragma comment(lib, "C:\\Oracle\\product\\12.1.0\\client_1\\lib\\orasql12.lib")
**此法優先級最高,能強制鏈接器引入指定庫,解決 90% 此類問題。**
proc iname=myapp.pc oname=myapp.cpp code=ANSI_C parse=PARTIAL include=(ORACLE_HOME\precomp\public)
code=ANSI_C 生成 C++Builder 兼容代碼。parse=PARTIAL 避免解析系統頭文件導致錯誤。確保目標機安裝 **Oracle Instant Client** 或完整 Client,且 PATH 環境變量包含其 bin 目錄,否則運行時會報 "OCI.DLL not found"。
| 誤區 | 正確做法 |
|---|---|
| 只加 DLL 目錄到 PATH | 鏈接時需 .lib,運行時需 DLL,兩者都要 |
| 用 64位 lib 鏈接 32位項目 | 位元數必須嚴格一致 |
| 依賴 IDE 自動查找庫 | 顯式指定庫路徑、庫名、或用 #pragma comment(lib) |
| 忽略 proc 編譯警告 | 警告可能隱含類型定義差異,導致符號不匹配 |
**核心解法:`#pragma comment(lib, "orasql12.lib")` + `#pragma comment(lib, "oci.lib")` 並確保庫路徑正確、位元數匹配。** 此法直接指導鏈接器引入包含 _sqlcxt 等 OCI 核心符號的庫,徹底解決 Unresolved external 錯誤。