我有一个本机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);
    };
}


Type.cpp

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

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


我的单元测试项目(.dll)不使用头文件进行测试。我正在使用Google测试框架。来源如下:

测试文件

#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:静态
  void __cdecl N:MyType:GetResult(class std :: basic_string,class std :: allocator>,class
  std :: basic_string,class
  std :: allocator>,枚举N :: ResultCode)“ ...在
  功能...


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


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


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

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

我该如何解决这个问题?

编辑:在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
}

}

关于c++ - LNK2019错误,但Intellisense工作正常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18200178/

10-14 06:36