現有一個VC6的工程A,元件B(VS2015版本)
A以隱式鏈接的方式(需要匯入庫檔案和dll檔案)呼叫B的介面。
編譯工程A,提示錯誤:無法決議的外部符號。在VC6工程中,無法識別B的介面名。
元件B匯出的介面是一個類,匯出方式如下:
上午在網上找了一下,好像是由于不同版本編譯器的ABI(二進制介面)不兼容導致的。
class _declspec(dllexport) MyClass
{
public:
void do_something1();
void do_something2();
....
....
};
可以采用factory function的方法來解決這個問題。
(可參考:https://eli.thegreenplace.net/2011/09/16/exporting-c-classes-from-a-dll/)
我的問題是:
在VC6工程中以隱式鏈接的方式去呼叫元件B提供的類介面,是不是肯定會失敗?
感謝指導交流
uj5u.com熱心網友回復:
沒有什么隱式鏈接這種說法,只有靜態鏈接和動態鏈接,你說的應該是靜態鏈接,靜態鏈接在遇到版本不一致的情況是有可能會失敗的,但是通常都可以成功,只有dll匯出的是正確的uj5u.com熱心網友回復:
好吧,是我不夠嚴謹,應該是”隱式加載“,我說的是呼叫元件兩種方式:“隱式加載"和”顯示加載"。
我把“隱式加載”說成了“隱式鏈接”,讓你誤以為我說的是靜態鏈接和動態鏈接。
靜態鏈接是程式編譯時的【鏈接階段】將靜態庫(static library)中的函式代碼和資料寫入到可執行檔案中;
而對于動態鏈接,在程式編譯時,并不會將函式代碼和資料寫到可執行檔案中。
若隱式加載元件,在程式編譯時會將匯入庫(import library)中鏈接到可執行檔案中。在程式運行時才會將dll中的函式代碼和資料加載到記憶體中。注:匯入庫(import library)中包含的內容是一些用于尋找dll檔案的符號。
若顯示加載元件,則不需要匯入庫(import library), 通過呼叫LoadLibrary在程式運行時將dll中的函式代碼和資料加載到記憶體中。
uj5u.com熱心網友回復:
另外,我反駁一下,收有“隱式鏈接”這種說法,“隱式鏈接”跟我上面說的“隱式加載”是一個意思。
請參見:https://docs.microsoft.com/en-us/previous-versions/d14wsce5(v=vs.140)?redirectedfrom=MSDN
uj5u.com熱心網友回復:
你說的對
uj5u.com熱心網友回復:
匯出類是個坑。。。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/15244.html
標籤:進程/線程/DLL
