2013-04-30 84 views
1

我正在使用Visual Studio 2010的工具鏈生成DLL。具體來說,我想要一個Matlab模塊。我相信我是相當接近,但我遇到了以下錯誤:鏈接DLL時的命令行錯誤

LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup 
.libs/AverageFilter.mexw32 : fatal error LNK1120: 1 unresolved externals 

有一個在我的DLL沒有這樣的符號,因爲它不存在意義是一個共享庫。但是,'libcmt.lib'包含可執行文件和DLL的符號。因此,我明白錯誤,但是由於我明確地創建了一個DLL,我期待微軟的鏈接器忽略這個特殊的未解決的符號。

據我所知,當生成DLL時,期望的是沒有未定義的符號,但由於唯一的這種符號是不相關的,我決定使用'/ FORCE'選項。我真的不喜歡這個解決方案,但首先我想有一個工作的Matlab模塊,然後改進我的解決方案。

不幸的是,使用下面的錯誤 '/ FORCE' 選項結果:

cl : Command line error D8021 : invalid numeric argument '/FORCE' 

我怎樣才能解決這些錯誤?有沒有辦法讓微軟的鏈接器忽略一個特定的未解決的符號?

+0

如果您打算對此進行投票,請發表評論。我一直在嘗試解決這個問題很長一段時間,它會讓別人無視任何解釋而無法投票。 – Daeden 2013-04-30 21:34:32

回答

1

的exe和dll的在Windows需要一個入口點,如果它們包含可執行代碼,看到這個MSDN頁的DllMain:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

對於它往往是主要的()爲一個控制檯應用程序的EXE,或WinMain獲取純粹的win32 API應用程序。

由於您的DLL需要一個main()我假設您必須創建一個EXE控制檯項目,然後將其更改爲一個DLL。

要解決您的問題,您需要創建通常爲DllMain的入口點函數,但在您的情況下實際上是主要的。您的DLL的入口點無能爲力(即空/存根函數),這將允許它鏈接,並由操作系統加載/卸載,然後允許您的客戶端調用您的代碼:)。

+0

感謝您的迴應保羅。我沒有使用Visual Studio IDE只有工具鏈,所以我不確定控制檯項目與DLL項目。該鏈接證明最有用! – Daeden 2013-04-30 22:05:34

+0

如果添加它應該全部鏈接的存根,則可以通過某個編譯器開關將入口點的名稱設置爲任何值。 – paulm 2013-04-30 22:06:52

+0

我會嘗試。鏈接器是否抱怨「主」符號而不是「dllMain」這一事實意味着它以某種方式認爲這是一個可執行文件而不是共享庫? – Daeden 2013-04-30 22:11:21