LNK2019错误,但Intellisense工作正常

时间:2013-08-13 03:26:58

标签: c++ linker lnk2019

我有一个本机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&gt;,class   的std :: basic_string的,类   std :: allocator&gt;,enum N :: ResultCode)“...引用于   功能......

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

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

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

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

我该如何解决这个问题?

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

2 个答案:

答案 0 :(得分: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
}

}

答案 1 :(得分:0)

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