2010-09-09 71 views
3

我正在編譯一個DLL兩次(一次用於x86,一次用於x64),並且已將set/ENTRY設置爲「DllMain」。我正在使用/ MT運行時庫選項來靜態鏈接運行時庫。這做x86版本時都做工精細,但x64的構建失敗,這樣的:DLL鏈接器問題

error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup 
{project directory}\LIBCMT.lib(crt0.obj) 

爲什麼這項工作的x86版本,而不是64位建?有什麼我在這裏失蹤?

+0

你爲什麼使用/ ENTRY? IIRC如果你使用的是標準的DllMain()函數,那麼運行時在沒有任何額外幫助的情況下調用它。 – 2010-09-09 22:42:42

+0

如果我在我的x86 DLL中指定/ ENTRY,最終的大小超過50kb,那麼DLL的最終大小是5kb,如果我沒有設置/ ENTRY。 – 2010-09-09 22:48:39

+2

通常,* real *入口點是由CRT提供的「假」DllMain取得的,用於初始化其內部數據結構(如此處所述:http://stackoverflow.com/questions/2674736/loading-a-dll-from- a-dll/2686042#2686042),所以你繞過它。尺寸縮小可能是由於CRT init代碼被刪除。你的dll正在使用一個非初始化的CRT,這非常糟糕。 – 2010-09-09 23:40:01

回答

1

不是一個直接的答案,但它可能是嚴格相關的:如評論所述,你應該避免以這種方式改變入口點:通常,真正的入口點是由CRT提供的「假」DllMain來初始化它的內部數據結構(如解釋here),所以你繞過它。尺寸縮小可能是由於CRT init代碼被刪除。

你的DLL正在使用非初始化的CRT,這是非常糟糕的。您應該離開默認入口點,順便說一句,應該解決您的問題。

順便說一句,請注意,其實你可以使一個DLL沒有CRT(它會變得非常小),但你不應該在所有使用CRT ,甚至沒有鏈接反對(/NODEFAULTLIB開關)。這意味着你可以使用你明確鏈接的庫(例如Windows API),但是我懷疑你會失去一些C++特性(至少我認爲是異常和RTTI)。

+0

非常好,謝謝你的信息! – 2010-09-12 15:24:22

0

這可能是一個愚蠢的問題,但你確定你是鏈接爲DLL在x64的情況下(即指定/DLL開關) - 因爲投訴是關於main,我不知道它是否試圖鏈接爲一個可執行文件?

+0

在「常規」選項卡上,我將配置類型設置爲「動態庫(.dll)」。你是這個意思嗎? – 2010-09-09 22:46:02

+0

這聽起來不錯。您應該通過項目設置的鏈接器/命令行頁面比較兩個目標的鏈接器命令行。 – RichieHindle 2010-09-09 22:47:25

+0

我比較了命令行,唯一不同的部分(除輸出文件夾外)是/ MACHINE選項。 – 2010-09-09 22:50:58