LNK2019错误,但Intellisense工作正常

LNK2019 error but Intellisense works fine

本文关键字:工作 Intellisense 错误 LNK2019      更新时间:2023-10-16

我有一个本机C++单元测试项目,该项目在测试中的每个函数调用都会抛出LNK2019错误。令人惊讶的是,IntelliSense工作得很好!

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

类型.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);
    };
}

类型.cpp

#include "pch.h"
#include "Type.h"
namespace N
{
    void MyType::GetResult(string id, string metadata, N::ResultCode result)
    {
        // implementation
    }
}

我的单元测试项目(.dll)不使用测试的头文件。我使用的是谷歌测试框架。以下是来源:

测试.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:staticvoid __cdecl N:MyType:GetResult(类std::basic_string,类std::allocater>,类std::basic_string,类std::allocater>,enum N::ResultCode)"…在中引用作用

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

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

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

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

我该如何着手解决此问题?

EDIT:显示cpp中的命名空间块。

这是您的问题:

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
}
}

我通过在配置属性>链接器>输入>附加依赖项的测试项目属性中添加对我的库的引用来解决这个问题。没有路径,只有"Type.lib".