我目前正在使用visual c ++实现一个DLL来生成QRCode。为了生成QR码,我从开源下载了QRGenration源代码。源代码具有文件“ QRGenerator.cpp ”,其具有“主”功能,其生成QRCode。 QRGeneation源代码成功编译并在执行时生成QRCode。
现在我想从我正在实现的新DLL中调用QR代码生成函数。在这种情况下,
我目前无法在“GenerateQRCode”中重命名主函数名称。当我将主函数更改为“GenerateQRCode”时,我得到以下错误。
> MSVCRTD.lib(crtexe.obj):错误LNK2019:函数___ tmainCRTStartup中引用了未解析的外部符号_main
我是Visual C ++的新手,我不能完成编译工作。你能帮我吗,我如何从我的DLL调用QR生成功能(“GenerateQRCode”)。
P.S:作为参考,我粘贴在我的程序目录结构
之下C:\ MYDLL \ MyDLL.cpp
c:\ QRGeneration \(源代码)
c:\ QRGeneration \ QRGeneration.cpp
提前致谢:)。
解决方案 我创建了一个带有QRCode类型静态库的现有项目。我导出了在我的库中使用extern生成QRCode的函数。然后我在http://msdn.microsoft.com/en-us/library/ms235627.aspx中提到的我的DLL中链接了这个库。并生成了我的DLL文件。
调用DLL时会生成QRCode。 谢谢:)。
答案 0 :(得分:0)
如果您只是将main重命名为MSVC项目中的另一个函数,该函数旨在生成可执行(.exe)文件,那么它将无法工作,因为main()将丢失。
您需要设置另一个创建DLL的项目,然后将其选项设置为类似于生成QR可执行文件的项目,以便此DLL将使用原始QR项目使用的任何源和库,然后重命名main()在这一个GenerateQRCode中。
您还需要导出此函数,以便在从另一个exe或dll加载新DLL时,此函数将可见并且可以被调用。这可以通过使用__declspec(dllexport)对其进行声明,或者在项目中使用.def文件来完成,在该项目中,您可以在EXPORTS部分中声明此导出。
一个好主意是导出它,或者使用extern" C"因此,尝试使用它的可执行文件不需要使用与编译DLL相同的完全编译器进行编译(由于名称修改),但这取决于您打算如何使用它。
编辑:
根据您的上次更新,您选择创建一个包含QR代码二进制文件的静态库,然后将其与您的DLL链接。然后,您将此DLL复制到另一个位置,并通过调用入口点函数生成QR代码。您的DLL现在包含QR静态库中所有必需的二进制文件,并且是自给自足的。 此外,由于您将DLL移动到另一个位置并生成QR代码,因此不会使用其他与外部QR相关的二进制代码。 要确保这一点,请从here下载依赖性walker,运行它,然后将DLL放入其中,并查看它依赖的其他DLL。
注意:' extern'你提到的关键字本身不会导出符号。它只是声明符号存在于整个代码中的某个位置。