【发布时间】:2026-01-11 11:05:02
【问题描述】:
我正在使用 Visual Studio 2008。我有一个包含几个项目的解决方案。 在一个项目(我们称之为 ProjectX)我有这些文件:
头文件 (ExportProject.h) 如下所示:
#ifndef __CExportProject_H_INCLUDED__
#define __CExportProject_H_INCLUDED__
class __declspec(dllimport) CExportProject{
string func1(... params1 ...);
void func2(... params2 ...);
}
#endif
和一个cpp文件(ExportProject.cpp):
#include "ExportProject.h"
string CExportProject::func1(... params1 ...){
...
return "some string";
}
void CExportProject::func2(){
string str = func1(... params ...);
}
当我单独编译 ProjectX 时,没有问题。 当我尝试编译包含 ProjectX 和其他一些项目的解决方案时,我收到此错误:(这包含函数的真实名称,我只是将它们重命名以使问题更清楚)
PageWorkspace.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CExportProject::ArgumentsToInApiString(class CInApiHash *,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class CArgumentsCollection const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (__imp_?ArgumentsToInApiString@CExportProject@@QAEXPAVCInApiHash@@AAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBVCArgumentsCollection@23@2@Z) referenced in function "protected: void __thiscall CWorkspacePage::OnExportAsInApi(void)" (?OnExportAsInApi@CWorkspacePage@@IAEXXZ)
显然,这是一个链接问题。只是为了确保我尝试将实现移动到标题并且它有效。
另外,当我在 func2 函数中的 cpp 文件上并右键单击对 func1 的调用并选择“转到定义”时,它会将我带到头文件上的声明而不是cpp中的定义。
可能是什么原因?
更新
正如我之前所说,当将实现移至标题并删除 __declspec(dllimport) 时,它可以工作。对于__declspec(dllimport),它不起作用(Hans Passant 在comment 中解释了原因)。
但即使没有__declspec(dllimport),当实现在 cpp 上时,我也会遇到相同的错误(当然,错误代码中没有 __declspec(dllimport) 前缀)。这表明问题,不是吗?
【问题讨论】:
-
请编辑您的问题以包含 complete 错误。
-
在 Visual Studio 中,仅在解决方案中包含两个项目不会导致它们链接在一起。
-
所有项目(其中 22 个)都已链接。这不是我第一次编译这个解决方案。
-
@ItayGal,好的,那么完整的错误信息就更重要了
-
你混淆了代码太多。只是在一个类上任意抛出一个 __declspec(dllimport) 属性是行不通的。在构建 DLL 的项目中,该类必须是 __declspec(dllexport)。然后使用 DLL 的另一个项目必须看到与 __declspec(dllimport) 完全相同的类,并且必须链接 DLL 项目生成的 .lib。错过最后一步总是会产生此链接器错误。
标签: c++ visual-studio-2008 linkage