【发布时间】:2011-03-21 18:40:38
【问题描述】:
我一直致力于在 Visual Studio 2008 中编译一个基本的 ATL 项目,但我一直遇到错误。最终我遇到了以下构建错误:
1>Linking...
1> Creating library Debug\SomeProject.lib and object Debug\SomeProject.exp
1>dllmain.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _IID_ISomeObject
1>Debug\SomeProject.dll : fatal error LNK1120: 2 unresolved externals
我忽略了什么或做错了什么?以下是重现的步骤。
- 创建一个名为
SomeProject的新ATL Project。接受所有默认值。 - 在解决方案资源管理器中右键单击项目并选择
Add > Class。 - 选择
ATL Simple Object并输入SomeObject作为其短名称。接受所有其他默认值。
此时项目构建良好。但是,我想将 IDL 拆分为多个文件以便更好地组织(我的 IDL 将有数千行长)。
- 右键单击项目并选择
Add > New Item。 - 选择
Midl File并输入ISomeObject作为其文件名。 - 打开
SomeProject.idl并剪切ISomeObject接口声明。将其替换为import "ISomeObject.idl";。 - 将接口声明粘贴到
ISomeObject.idl。
为了满足微软的 IDL 编译器我们需要更改一些选项:
- 右键单击项目并打开其属性。转到
MIDL > Output部分并输入以下值:- 头文件:
$(InputName).h - IID 文件:
$(InputName)_i.cpp - 代理文件:
$(InputName)_p.cpp - 生成类型库:
No
- 头文件:
- 转到
C/C++ > Precompiled Headers部分并将Create/Use Precompiled Header设置为Not using Precompiled Header。如果使用预编译的头文件,以后会有错误。 - 选择
SomeProject.idl文件以显示其属性。转到MIDL > Output部分并将Generate Type Library设置为Yes。 - 从
Generated Files过滤器中删除SomeProject_i.h和SomeProject_i.c。 - 将以下现有项目添加到
Generated Files过滤器。您可能需要先尝试编译项目。SomeProject.hSomeProject_i.cppISomeObject.hISomeObject_i.cpp
现在,此时我希望项目能够编译。但事实并非如此。您应该会收到我在此问题顶部列出的 LNK1120 错误。
有什么想法吗?我忽略了一些简单的事情吗?
【问题讨论】:
标签: visual-studio-2008 linker atl idl