使用Visual Studio C+进行单元测试时发生链接器错误+; 我想用VisualStudio对我的C++项目进行单元测试。将项目中的文件夹作为包含路径添加到测试项目后,在尝试编译测试时出现链接器错误: Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: __thiscall Piece::Piece(enum Color)" (??0Piece@@QAE@W4Color@@@Z) referenced in function "public: __thiscall Bishop::Bishop(enum Color)" (??0Bishop@@QAE@W4Color@@@Z) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2019 unresolved external symbol "public: __thiscall Board::~Board(void)" (??1Board@@QAE@XZ) referenced in function "public: void __thiscall ChessPlusPlusTests::BishopTests::ValidMovesTest(void)" (?ValidMovesTest@BishopTests@ChessPlusPlusTests@@QAEXXZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2019 unresolved external symbol "public: void __thiscall Board::placePieceAt(class Piece * const,struct Position)" (?placePieceAt@Board@@QAEXQAVPiece@@UPosition@@@Z) referenced in function "public: void __thiscall ChessPlusPlusTests::BishopTests::ValidMovesTest(void)" (?ValidMovesTest@BishopTests@ChessPlusPlusTests@@QAEXXZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::vector<struct Position,class std::allocator<struct Position> > __thiscall Bishop::getMovesFor(struct Position,class Board &)" (?getMovesFor@Bishop@@UAE?AV?$vector@UPosition@@V?$allocator@UPosition@@@std@@@std@@UPosition@@AAVBoard@@@Z) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Bishop::toString(void)" (?toString@Bishop@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Bishop::toShortString(void)" (?toShortString@Bishop@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1
如果不添加include路径,测试项目不会编译,因为主项目中的头文件include依赖于include路径 主项目编译得很好 有人能帮我了解出了什么问题吗 谢谢 我发现您必须将.h和.cpp文件作为现有文件添加到测试项目中。这在官方文件中被遗漏了,否则我就错过了 现在它工作了使用Visual Studio C+进行单元测试时发生链接器错误+; 我想用VisualStudio对我的C++项目进行单元测试。将项目中的文件夹作为包含路径添加到测试项目后,在尝试编译测试时出现链接器错误: Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: __thiscall Piece::Piece(enum Color)" (??0Piece@@QAE@W4Color@@@Z) referenced in function "public: __thiscall Bishop::Bishop(enum Color)" (??0Bishop@@QAE@W4Color@@@Z) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2019 unresolved external symbol "public: __thiscall Board::~Board(void)" (??1Board@@QAE@XZ) referenced in function "public: void __thiscall ChessPlusPlusTests::BishopTests::ValidMovesTest(void)" (?ValidMovesTest@BishopTests@ChessPlusPlusTests@@QAEXXZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2019 unresolved external symbol "public: void __thiscall Board::placePieceAt(class Piece * const,struct Position)" (?placePieceAt@Board@@QAEXQAVPiece@@UPosition@@@Z) referenced in function "public: void __thiscall ChessPlusPlusTests::BishopTests::ValidMovesTest(void)" (?ValidMovesTest@BishopTests@ChessPlusPlusTests@@QAEXXZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::vector<struct Position,class std::allocator<struct Position> > __thiscall Bishop::getMovesFor(struct Position,class Board &)" (?getMovesFor@Bishop@@UAE?AV?$vector@UPosition@@V?$allocator@UPosition@@@std@@@std@@UPosition@@AAVBoard@@@Z) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Bishop::toString(void)" (?toString@Bishop@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1 Error LNK2001 unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Bishop::toShortString(void)" (?toShortString@Bishop@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) ChessPlusPlus-Tests D:\Documents\Projects\ChessPlusPlus\ChessPlusPlus-Tests\BishopTests.obj 1,c++,visual-studio,unit-testing,linker-errors,C++,Visual Studio,Unit Testing,Linker Errors,如果不添加include路径,测试项目不会编译,因为主项目中的头文件include依赖于include路径 主项目编译得很好 有人能帮我了解出了什么问题吗 谢谢 我发现您必须将.h和.cpp文件作为现有文件添加到测试项目中。这在官方文件中被遗漏了,否则我就错过了 现在它工作了 我只是遇到了同样的问题,并以不同的方式解决了它,以下是Microsoft文档: 我认为这个解决方案有点简洁,因为您最终不会看到测试项目中的所有头文件也显示在您的测试项目中 文档中斜体的行和粗体的行是我添加的: 如果测试中
我只是遇到了同样的问题,并以不同的方式解决了它,以下是Microsoft文档: 我认为这个解决方案有点简洁,因为您最终不会看到测试项目中的所有头文件也显示在您的测试项目中 文档中斜体的行和粗体的行是我添加的: 如果测试中的代码没有导出要测试的函数,可以将output.obj或.lib文件添加到测试项目的依赖项中 < P>创建C++测试项目。
在文件菜单中,选择新的、项目、Visual C++、测试、C++单元测试项目。 确保添加要作为引用测试的项目。如果忘记了,也可以稍后在解决方案资源管理器窗口中添加这些引用。
在解决方案资源管理器中,在测试项目的快捷菜单上,选择“属性”。此时将打开“项目属性”窗口 选择配置属性、链接器、输入和其他依赖项 选择“编辑”,然后添加.obj或.lib文件的名称。不要使用完整的路径名 对我来说,只有.obj文件。我在Intermediates文件夹中找到了它们,其中有多个版本,每个版本对应于解决方案平台(x86或x64)和解决方案配置(调试或发布)的组合。如果您有很多.obj(或.lib)文件,我发现打开一个终端并运行ls(或dir)来获取文件名,编辑出我不需要的.log、.txt和.pdb文件名,然后将.obj文件名列表复制粘贴到Visual Studio中是很方便的。为便于编辑,请注意,您可以单击“附加依赖项”输入字段右侧的下拉箭头,然后单击“编辑”。 选择配置属性、链接器、常规、其他库目录 选择编辑,并添加.obj或.lib文件的目录路径。路径通常位于测试项目的生成文件夹中 对我来说,我只有.obj文件。我在Intermediates文件夹中找到了它们,其中有多个版本,每个版本对应于解决方案平台(x86或x64)和解决方案配置(调试或发布)的组合。为所有4种组合设置此路径的方便宏如下:$(SolutionDir)bin\$(PlatformTarget)\$(IntermediateOutputPath)Intermediates。您可能需要取出bin\part,因为我还看到输出文件夹直接设置在解决方案目录中,而不是单独的二进制文件夹中。 选择配置属性、VC++目录、包含目录 选择Edit,然后添加测试项目的标题目录 对于此目录,可以直接指向作为测试项目一部分的文件夹。不需要将头文件复制到测试项目。如果此目录包含的不仅仅是标题,也可以。例如,“我的源”文件夹包含.h文件和.cpp文件。 完成这些步骤后,我可以通过简单地编写以下内容将头文件包括在测试代码中: 包括“SomeHeaderName.h” 因此,无需指定头文件所在的文件夹。确保清理并重建整个解决方案。然后,您的测试应该能够访问您正在测试的项目的功能。我认为选择的答案不正确。测试通常应在其环境中运行;因此,他们不应该访问实现(.cpp)
在Visual Studio(VS 2017)上创建单独的测试项目时,需要创建对要测试的项目的引用(右键单击测试项目->添加->引用->勾选项目): 如果您看到一些链接器错误,右键单击单元测试项目:项目->链接器->输入->其他依赖项->编辑 然后将路径添加到.obj文件中。 您可以尝试类似“$(SolutionDir)ConsoleApplication1\$(IntDir)*.obj”的操作,其中ConsoleApplication1是目标项目名称
起初,我只想在Cornelis的帖子上发表评论,但我做不到。您是否在project Properties中添加了静态库及其路径?我不知道您的意思。我添加了主项目作为测试项目的参考,并且只使用标准libs。谢谢你,好先生!很多人建议将我的项目转换成dll或其他什么,而你在这里提供了最简单的解决方案。我不知道为什么这不是最简单的解决方案。显然,这是最好的理想解决方案,我在微软官方博客中没有发现它。他们只是简单地说明了向现有项目添加一个引用,依赖项将自动配置,但事实并非如此,而且他们没有继续使用目标项目中的函数编写测试。这非常有效。你知道这样做是否正确吗?这看起来很老套。添加一个引用不应该解决这个问题吗?这是一条路要走。添加一个引用就足够了,但是,如果不够,您必须手动指定一些引用。
#include "stdafx.h"
#include "CppUnitTest.h"
#include "Bishop.h"
#include "Board.h"
#include "TestUtils.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace ChessPlusPlusTests
{
TEST_CLASS(BishopTests)
{
public:
TEST_METHOD(ValidMovesTest)
{
// Arrange
Board board{};
Bishop *piece = new Bishop{ Color::WHITE };
Position pos{ 3,3 };
board.placePieceAt(piece, pos);
// Act
auto validPositions = piece->getMovesFor(pos, board);
// Assert
TestUtils::AssertPositions(validPositions, {
0,0,0,0,0,0,0,1,
1,0,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,0,1,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,1,0,0,0,
0,1,0,0,0,1,0,0,
1,0,0,0,0,0,1,0,
});
}
};
}