我在測驗專案中有以下檔案:
測驗.cpp:
#include "pch.h"
#include "CppUnitTest.h"
#include <iostream>
#include "PrintOne.cpp"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace PointandVectorCreationTest
{
TEST_CLASS(PointandVectorCreationTest)
{
public:
TEST_METHOD(TestMethod1)
{
std::string expected = "1\n";
std::stringstream buffer;
std::streambuf* sbuf = std::cout.rdbuf(); // Save cout's buffer
std::cout.rdbuf(buffer.rdbuf()); // Redirect cout to the stringstream buffer
int result = printOne();
// When finished, redirect cout to the original buffer
std::cout.rdbuf(sbuf);
std::cout << "std original buffer: \n";
std::cout << buffer.get();
// Test
Assert::AreEqual(expected, buffer.str());
}
};
}
PrintOne.cpp:
#include <iostream>
int printOne() {
std::cout << 1 << std::endl;
return 0;
}
當我嘗試在 Visual Studio 中運行此測驗時,聯結器會引發以下錯誤:
錯誤 LNK2005 "int __cdecl printOne(void)" (?printOne@@YAHXZ) 已在 PrintOne.obj 中定義
鏈接時拋出此錯誤Test.obj。
我沒有printOne在Test.cpp. 事實上,如果我只是將函式的定義復制到Test.cpp并洗掉PrintOne.cpp檔案,如下所示:
測驗.cpp:
#include "pch.h"
#include "CppUnitTest.h"
#include <iostream>
int printOne() {
std::cout << 1 << std::endl;
return 0;
}
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace PointandVectorCreationTest
{
TEST_CLASS(PointandVectorCreationTest)
{
public:
TEST_METHOD(TestMethod1)
{
std::string expected = "1\n";
std::stringstream buffer;
std::streambuf* sbuf = std::cout.rdbuf(); // Save cout's buffer
std::cout.rdbuf(buffer.rdbuf()); // Redirect cout to the stringstream buffer
int result = printOne();
// When finished, redirect cout to the original buffer
std::cout.rdbuf(sbuf);
std::cout << "std original buffer: \n";
std::cout << buffer.get();
// Test
Assert::AreEqual(expected, buffer.str());
}
};
}
測驗運行得很好。我寧愿避免在測驗它們的同一個檔案中撰寫我使用的所有函式,所以對我來說這不應該是一個解決方案。
為什么聯結器會拋出這個例外?我該如何解決這個問題,以便我可以將我的函式定義與測驗檔案分開?
uj5u.com熱心網友回復:
我沒有
printOne在Test.cpp.
實際上,當您查看into#include的源代碼時,您就是這樣。如果再編譯和鏈接都和在一起,所以鏈接確實看到了2個定義,一個在每個檔案。PrintOne.cppTest.cppTest.cppPrintOne.cppprintOne().obj
對于您嘗試執行的操作,您需要添加一個.h僅宣告 的檔案,printOne()然后您可以#include將該檔案放入兩個.cpp檔案中,其中只有一個檔案定義了 printOne(),例如:
測驗.cpp:
#include "pch.h"
#include "CppUnitTest.h"
#include <iostream>
#include "PrintOne.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace PointandVectorCreationTest
{
TEST_CLASS(PointandVectorCreationTest)
{
public:
TEST_METHOD(TestMethod1)
{
std::string expected = "1\n";
std::stringstream buffer;
std::streambuf* sbuf = std::cout.rdbuf(); // Save cout's buffer
std::cout.rdbuf(buffer.rdbuf()); // Redirect cout to the stringstream buffer
int result = printOne();
// When finished, redirect cout to the original buffer
std::cout.rdbuf(sbuf);
std::cout << "std original buffer: \n";
std::cout << buffer.get();
// Test
Assert::AreEqual(expected, buffer.str());
}
};
}
列印檔案
#pragma once
int printOne();
PrintOne.cpp:
#include "PrintOne.h"
#include <iostream>
int printOne() {
std::cout << 1 << std::endl;
return 0;
}
uj5u.com熱心網友回復:
當您#include "PrintOne.cpp"的Test.cpp檔案中有一行 like時, 的全部內容PrintOne.cpp(包括printOne()函式的定義)將包含在Test.cpp的源代碼中;因此,該Test.obj檔案將包含printOne()函式的定義。
如果您PrintOne.cpp的專案中還包含該檔案 - 從聯結器正在參考一個PrintOne.obj模塊的事實看來- 那么該目標檔案中也會有該printOne()函式的定義。
因此,正如聯結器所指示的那樣,您有多個(盡管相同)的函式定義。
為避免這種情況,請將PrintOne.cpp 源檔案的包含替換為為函式#include "PrintOne.h"提供宣告(原型/簽名)的標頭(例如)printOne(源檔案的內容將被添加,無論如何,如果它是專案。)
通常,不建議使用#include ...源 (cpp) 檔案(盡管在某些情況下它可能有用)。值得一讀:我什么時候需要#include .cpp 檔案?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/395324.html
下一篇:減速器的測驗回傳不等于預期的結果
