【问题标题】:Can't manage to link a cpp file - unresolved external symbol无法链接 cpp 文件 - 无法解析的外部符号
【发布时间】: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


【解决方案1】:

嗯,我发现了问题,和__declspec(dllimport)无关。

我在同一个项目中定义的其他一些类中调用func2。 此调用产生了错误。当我评论电话时,问题就消失了。 func2 的参数之一是CString&amp; str。显然MFC 没有在其他项目中使用,其中包括调用func2 的第一个项目的库,所以我不能使用CString

改成std:string即可解决问题。

我仍然不明白的一件事是为什么我收到此错误而不是实际指示问题的错误。正如您在错误代码中看到的那样,func2ArgumentsToInApiString,但仍然没有任何迹象表明 Cstring 未知。

【讨论】:

  • 我也看到了这个问题。从 VS6.0 到 VS2013 的旧版 C++ DLL。循环引用附近的项目很多。真是一团糟。我找到了这个有趣的链接并进行了修复,但它对我不起作用。我怀疑某些模块没有使用 MFC。 // // support.microsoft.com/en-us/help/309801/… // 模板类 __declspec(dllimport) CStringT > >;模板类 __declspec(dllimport) CSimpleStringT;