LNK2019 错误,但 Intellisense 工作正常

Posted

技术标签:

【中文标题】LNK2019 错误,但 Intellisense 工作正常【英文标题】:LNK2019 error but Intellisense works fine 【发布时间】:2013-08-13 03:26:57 【问题描述】:

我有一个本机 C++ 单元测试项目,它为被测项目中的每个函数调用引发 LNK2019 错误。令人惊讶的是,IntelliSense 工作得很好!

被测项目是一个静态库 (.lib),由单个公共静态函数组成(类型和成员名称已更改以保护无辜者):

Type.h

#pragma once

#include <string>

using namespace std;

namespace N

    enum class ResultCode  Undefined, A, B, C; 

    class MyType
    
    public:
        static void GetResult(string id, string metadata, ResultCode result);
    ;

Type.cpp

#include "pch.h"
#include "Type.h"

namespace N

    void MyType::GetResult(string id, string metadata, N::ResultCode result)
    
        // implementation
    

我的单元测试项目(.dll)不使用头文件进行测试。我正在使用谷歌测试框架。以下是出处:

Test.cpp

#include <pch.h>
#include <gtest/gtest.h>
#include <gtesthelpers/gtesthelpers.h>
#include <MyType.h>

class MyTypeUnitTests : public testing::Test ;

TEST(MyTypeUnitTests, Foo)

    std::string metadata; 
    N::ResultCode result = N::ResultCode::Undefined;
    N::MyType::GetResult("1234", metadata, result);
    ASSERT_TRUE(result == N::ResultCode::A);

当我编译 MyType 时,一切都很好。当我编写 Test 时,IntelliSense 为我提供了 GetResult 的签名。但是当我编译时:

Test.obj:错误 LNK2019:无法解析的外部符号“public:static void __cdecl N:MyType:GetResult(class std::basic_string,class std::allocator >,class std::basic_string,类 std::allocator >, enum N::ResultCode)" ... 引用于 函数...

我已经修改了测试项目的属性,以便:

VC++ 目录> 包含目录 包含对包含 MyType.h 的目录的引用; VC++ 目录> 参考目录 包括对包含 MyType.lib 的目录的引用;

我还确认在测试项目的项目依赖项下,检查了被测项目。我还使用了 undname 来验证错误中指定的函数名称是否与 .h 和 .cpp 中的名称匹配。

最后我在 MyType 中创建了一个新的静态无参数函数,并尝试从测试中调用它(以排除 enum 参数的问题)但没有骰子。我已按照上面链接到的 MSDN 页面上的说明进行操作,但我没有想法。

我该如何解决这个问题?

编辑:在 cpp 中显示命名空间块。

【问题讨论】:

【参考方案1】:

这是你的问题:

using namespace N;

void MyType::GetResult(string id, string metadata, N::ResultCode result)

    // implementation

您实际上应该将定义包装到命名空间中:

namespace N


void MyType::GetResult(string id, string metadata, N::ResultCode result)

    // implementation



【讨论】:

我只是将定义包装在“命名空间 N ...”中,但我遇到了同样的错误。两种情况下的错误(包装之前和之后)表明链接器知道命名空间,尽管我不知道这意味着什么。【参考方案2】:

我通过在 Configuration Properties > Linker > Input > Additional Dependencies 的测试项目属性中添加对我的库的引用解决了这个问题。没有路径,只有“Type.lib”。

【讨论】:

以上是关于LNK2019 错误,但 Intellisense 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

打开简历 3.0.0 LNK2019 错误

什么会导致 Visual Studio 中的 LNK2019 错误?

混合 C 和 C++ 时继续出现 LNK2019 错误

MSVC 中的链接错误 LNK2019,带有 __imp__ 前缀的未解析符号,但应该来自静态库

将 DCMTK 与 Visual Studio 一起使用时出现链接器错误 LNK2019

编译静态库遇到的 LNK2019 报错