1

我正在使用 Visual Studio 2010 的工具链来生成 DLL。具体来说,我想要一个 Matlab 模块。我相信我已经很接近了,但是我遇到了以下错误:

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,因此我希望 Microsoft 的链接器忽略这个特定的未解析符号。

据我了解,在生成 DLL 时,期望没有未定义的符号,但由于唯一这样的符号无关紧要,我决定使用“/FORCE”选项。我真的不喜欢这个解决方案,但首先我想要一个工作的 Matlab 模块,然后改进我的解决方案。

不幸的是,使用 '/FORCE' 选项会导致以下错误:

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

如何解决这些错误?有没有办法让微软的链接器忽略特定的未解析符号?

4

1 回答 1

1

如果它们包含可执行代码,则 Windows 中的 Exe 和 Dll 需要一个入口点,请参阅 DllMain 的此 MSDN 页面:

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

对于 exe,它往往是控制台应用程序的 main(),或纯 win32 API 应用程序的 WinMain。

由于您的 DLL 需要 main(),我假设您必须创建了一个 EXE 控制台项目,然后稍后将其更改为 DLL。

要解决您的问题,您需要创建通常是 DllMain 的入口点函数,但在您的情况下实际上是 main。您的 DLL 的入口点不能做任何事情(即空/存根函数),这将允许它链接,并由操作系统加载/卸载,然后允许您的客户端调用您的代码:)。

于 2013-04-30T21:58:49.950 回答