我有一个本机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/