使用VS2010创建C++非托管DLL

4

我在VS2010中创建了一个dll项目(Win32控制台应用>dll)。我将一些头文件放入项目中,当我编译时出现以下错误:

error LINK2001: unresolved external symbol _dllmaincrtstartup@12

这是什么?我该如何修复它?此外,头文件定义了许多抽象类。

1
如果这是一个控制台应用程序,为什么需要 DLL 文件? - ThomasMcLeod
2
@ThomasMcLeod:VS中的向导有点误导人-首先您必须选择“Win32控制台应用程序”,然后在第二步中选择“DLL”。 - Simon
项目向导有几个入口,这很令人困惑。但是当您进入Win32应用程序向导时,在“应用程序设置”对话框的最后一页,您需要选择“控制台应用程序”,而不是“DLL”。 - ThomasMcLeod
2个回答

0

使用/NOENTRY选项创建仅资源 DLL时是必需的。使用此选项可以防止 LINK 将对 _main 的引用链接到 DLL 中。

项目属性页 -> 链接器 -> 高级:无入口点设置为是 (/NOENTRY)

"/clr 编译的对象所包含的 DLL未使用/NOENTRY进行链接;图像可能无法正确运行" http://support.microsoft.com/kb/814472


2
我认为这个问题与仅限资源的DLL无关。 - crashmstr
但是最后一条评论是“将DllMain添加到.cpp文件中解决了问题。现在可以编译了。谢谢。- atoMerz Dec 10 '11 at 22:33”,我猜它是仅包含资源的DLL。 - Dmitry Kazakov
此外,头文件定义了许多抽象类。这听起来不像只是资源的问题。它似乎是他们没有正确地使用向导(或选择了错误的选项)。 - crashmstr

-1

问:是.dll构建失败了(而不是使用.dll的.exe),对吗?

问:你的.dll源代码中是否有DllMain()函数?

如果没有,你会考虑添加一个吗?

问:你确定项目设置已配置为“DLL”吗?对于“/MT”(多线程,静态链接)?

如果所有其他方法都失败了,你是否考虑创建一个新项目,创建一个“hello world”的.dll,并验证它是否可以构建?


不需要。它是用来做什么的? - atoMerz
8
这应该是对问题的评论,而不是答案。 - André Caron
是的,这个dll出了问题。我还没有创建一个使用它的项目。DLLMain不存在。添加void DLLMain() {}也没有帮助。我知道的就是配置类型设置为动态链接库(.dll)。 - atoMerz
我创建了另一个项目,并添加了一个带有单个Hello函数的头文件,该函数打印“Hello World!”。当我编译时,我得到了与之前相同的错误。 - atoMerz
2
将 DllMain 添加到 .cpp 文件中解决了问题。现在可以编译了。谢谢。 - atoMerz
从答案中并不清楚为什么添加 DllMain 就解决了不同的缺失符号 _dllmaincrtstartup - Bojan Komazec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接