我有一个本机 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: static void __cdecl N:MyType:GetResult(class std::basic_string,class std::allocator >,class std::basic_string,class std::allocator >, enum N ::ResultCode)" ...在函数中引用...
我已经修改了测试项目属性,以便:
- VC++ Directories > Include Directories包含对包含 MyType.h 的目录的引用;
- VC++ 目录 > 参考目录包括对包含 MyType.lib 的目录的引用;
我还确认在测试项目的项目依赖项下,检查了被测项目。我还使用了 undname 来验证错误中指定的函数名称是否与 .h 和 .cpp 中的名称匹配。
最后,我在 MyType 中创建了一个新的静态无参数函数,并尝试从测试中调用它(以排除 enum 参数的问题)但没有骰子。我已按照上面链接到的 MSDN 页面上的说明进行操作,但我没有想法。
我该如何解决这个问题?
编辑:在 cpp 中显示命名空间块。