C++Builder 與 Visual C++ 生成的導入庫(.lib)格式不兼容(OMF vs COFF),導致隱式鏈接報錯 contains invalid OMF record。本文提供兩種成熟解決方案。
運行時動態加載 DLL,通過函數指針調用導出函數,完全繞過靜態鏈接階段。
LoadLibrary 加載 DLL 獲取模塊句柄。GetProcAddress 獲取導出函數地址。FreeLibrary 釋放模塊。VC++ DLL 導出 (addit.cpp):
extern "C" {
__declspec(dllexport) void addit(int a, int b, int *c) {
*c = a + b;
}
}
C++Builder 調用端:
HINSTANCE handle = LoadLibrary("addit.dll");
if (handle) {
FARPROC lpFarProc = GetProcAddress(handle, "addit");
if (lpFarProc) {
void (__cdecl *lpaddit)(int, int, int*) = (void(__cdecl*)(int,int,int*))lpFarProc;
int ntemp;
lpaddit(2, 3, &ntemp); // 調用成功
}
FreeLibrary(handle);
}
驗證環境:VC++ 5.0 / C++Builder 3.0 通過。
implib.exe 重建導入庫 —— 恢復隱式鏈接便利性implib addit.lib addit.dll 生成 BCB 兼容的 .lib 文件。extern __stdcall void addit(int a, int b, int *c);此法保留了靜態鏈接的代碼簡潔性,同樣在 VC++ 5.0 / BCB 3.0 驗證通過。
跨編譯器調用 DLL 時,優先考慮 implib 重建導入庫以保持代碼優雅;若環境受限或需極致控制加載時機,顯式鏈接是萬能後備方案。