2014-09-27 77 views
0

我目前在Visual C++中實現一個DLL來生成QRCode。要生成QR碼,我已經從開放源代碼下載了QRGenration源代碼。該源代碼具有文件「QRGenerator.cpp」,其具有「主要」功能,其生成QR碼。 QRGeneation源代碼編譯成功並在執行時生成QRCode。將外部C++源文件鏈接到我的DLL庫

現在我想從我正在實現的新DLL中調用QR碼生成函數。在這種情況下,

  • 我想在「QRGenerator.cpp」爲「GenerateQRCode」
  • 重命名功能「主」然後調用「GenerateQRCode」從我的DLL。

我目前無法重命名「GenerateQRCode」中的主函數名稱。當我將主要功能更改爲「GenerateQRCode」時,出現以下錯誤。

> MSVCRTD.LIB(crtexe.obj):錯誤LNK2019:無法解析的外部符號_main函數___tmainCRTStartup引用

我是新來的Visual C++和我出我的選擇,使這個編制工作。你能幫我嗎,我怎樣才能從我的DLL調用QR生成函數(「GenerateQRCode」)。

PS:對於參考我正在粘貼下面我的程序的我的目錄結構

C:\ MYDLL \ MyDLL.cpp

C:\ QRGeneration \(源代碼)

C:\ QRGeneration \ QRGeneration.cpp

在此先感謝:)。

解決方案 我已創建了QRCode.I的類型靜態庫的現有項目中導出在我的圖書館使用的extern其生成QR碼的功能。然後我在http://msdn.microsoft.com/en-us/library/ms235627.aspx中提到的將DLL鏈接到我的DLL中。並生成我的DLL文件。

QRCode是在調用DLL時生成的。 謝謝:)。

回答

0

如果您只是將MSVC項目中的另一個函數重命名爲生成可執行文件(.exe),那麼它將不起作用,因爲main()將會丟失。

您需要設置另一個創建DLL的項目,然後將其選項設置爲類似於生成QR可執行文件的選項,以便此DLL將使用原始QR項目使用的任何源代碼和庫,然後將這個中的main()重命名爲GenerateQRCode。

您還需要導出此函數,以便從另一個exe或dll加載新DLL時,此函數將可見並可以調用。這可以通過使用__declspec(dllexport)對其進行延遲來完成,也可以在項目中使用.def文件來完成,其中您在EXPORTS部分中聲明瞭此導出。

一個好主意是導出它,或者使用extern「C」的C封裝器,所以試圖使用它的可執行文件不需要用與編譯DLL相同的編譯器進行編譯(由於名稱搗毀),但這取決於你打算如何使用它。

編輯:

根據你上一次更新,您當選爲創建一個包含QR碼二進制代碼靜態庫,然後用你的DLL鏈接它。然後,您將此DLL複製到另一個位置,並通過調用入口點函數生成QR碼。您的DLL現在包含來自QR靜態庫的所有必需二進制文件,並且是自給自足的。 此外,由於您將DLL移至其他位置並生成QR碼,這意味着無法使用其他外部QR相關二進制碼。 爲確保這一點,請從here下載dependency walker,運行它,然後將DLL放入其中,然後查看它依賴的其他DLL。

注意:您提到的'extern'關鍵字本身不會導出符號。它僅僅聲明一個符號存在於你的總代碼中。

+0

DNT:感謝您的回覆。「您需要設置另一個創建DLL的項目,然後將其選項設置爲類似於......」。我們應該怎麼做。我仍然沒有得到關於如何將QR源代碼鏈接到我的DLL的想法:( – 2014-09-27 20:14:36

+0

我不知道我理解你的問題。你問如何使用MS Visual Studio來建立一個DLL項目,或者如何在DLL項目中使用源文件和lib文件? – DNT 2014-09-28 03:28:38

+0

DNT:我終於找到了一個解決方案。我創建了一個QRCode的靜態庫項目,然後將這個庫鏈接到我的DLL中,它工作正常,我還有一個疑問。我只將DLL文件複製到一個特定的位置(c:/Mypath/mydll.dll),它將被應用程序調用,我只將新的DLL文件複製到這個路徑中,並且沒有複製QRGenerator庫文件。 DLL生成QRCode。我的DLL是否與庫生成?我有興趣知道這是如何工作的。注意:我已經使用extern在QRCode庫中導出函數「GenerateQRcode」。 – 2014-09-28 05:50:33