MT模式下靜態鏈結錯誤的問題

2021-07-10 07:33:36 字數 1324 閱讀 9598

今天在學習mfc的過程中遇到了乙個問題,在include了afx.h後報錯,說不能使用「/md」;搜了一下網上說是vs本身的報錯,於是換用了「/mt」;然後出現了重定義的鏈結錯誤:

1>uafxcwd.lib(afxmem.obj) : error lnk2005: 「void * __cdecl operator new(unsigned int)」 (??2@yapaxi@z) 已經在 libcmtd.lib(new_scalar.obj) 中定義

1>uafxcwd.lib(afxmem.obj) : error lnk2005: 「void __cdecl operator delete(void *)」 (??3@yaxpax@z) 已經在 libcmtd.lib(delete_scalar.obj) 中定義

1>uafxcwd.lib(afxmem.obj) : error lnk2005: 「void __cdecl operator delete(void *)」 (??_v@yaxpax@z) 已經在 libcmtd.lib(delete_array.obj) 中定義

搜了一些文章,決定簡要總結一下;

其實現在還是感覺有點模糊的說;

順便發現了一本一定要看的書。。。寫進小本本 =。=~

本例原因:

crt 庫對 new、delete 和 dllmain 函式使用弱外部鏈結。mfc 庫也包含 new、delete 和 dllmain 函式。這些函式要求先鏈結 mfc 庫,然後再鏈結 crt 庫。

解決方法:

1.配置mfc的使用為在靜態庫中使用mfc:

屬性->常規->mfc的使用,選擇「在靜態庫中使用 mfc」

2.配置執行庫:

屬性->c/c++->**生成->執行庫,選擇「多執行緒(/mt)」(release)或者「多執行緒除錯 (/mtd)」(debug)。

3.庫鏈結配置

屬性->鏈結器->輸入->附加依賴項,新增uafxcw.lib(看具體是什麼庫,如nafxcw.lib)和libcmt.lib(注意:順序不能顛倒)

另外,mt/md容易出現的問題:

所有的模組必須採用相同的執行時庫,否則就會出現重定義的錯誤,因為他們使用的執行時庫是不同的檔案的緣故。

但是明明只有乙個模組呢?這是因為雖然自己的這個模組用的/mt,但是「uafxcwd.lib」這個庫不一定/md。通過檢視.make檔案可以檢視它用的是什麼編譯選項。

參考:

/mt、/md編譯選項的區別

msvcrtd.lib和libcmtd.lib的衝突

linux下的靜態鏈結和動態鏈結(一)

靜態鏈結 靜態鏈結就是,在生成可執行程式的時候,把目標檔案.o 和 靜態庫 a 使用 ld 鏈結器,鏈結生成乙個可執行程式。這是在程式載入前就完成的動作。靜態庫的生成 以 lib.c為例子,如下 include void foobar int i 使用 gcc c lib.c 命令生成 lib.o ...

鏈結靜態庫的順序問題

libb.a依賴於是liba.a,而可執行檔案test只直接依賴於libb.a,則鏈結選項應當為 b a,而不是 a b,否則會報liba.a中的某些符號找不到.gcc c a.c ar cr liba.a a.o gcc c b.c ar cr libb.a b.o 雖然libb.a使用到了lib...

boost靜態鏈結的問題 lgcc s

在使用gcc g 編譯程式時我們希望指向一些庫是使用靜態的鏈結方式.另外的一些是動態的方式.我以boost 為例.如果我們要使用靜態庫則是這樣的 g main.cpp lpthread usr lib64 libboost thread.a usr lib64 libboost system.a 靜...