이 오류가 발생하지만 해결 방법을 모르겠습니다.
저는 Visual Studio 2013을 사용하고 있습니다. 솔루션 이름을 MyProjectTest로 지정했습니다.
이것은 테스트 솔루션의 구조입니다.
– function.h
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H
int multiple(int x, int y);
#endif
-function.cpp
#include "function.h"
int multiple(int x, int y){
return x*y;
}
– MAIN.CPP
#include <iostream>
#include <cstdlib>
#include "function.h"
using namespace std;
int main(){
int a, b;
cin >> a >> b;
cout << multiple(a, b) << endl;
system("pause");
return 0;
}
저는 초보자입니다. 이것은 간단한 프로그램이며 오류없이 실행됩니다. 나는 인터넷에서 읽고 단위 테스트에 관심이 생겨서 테스트 프로젝트를 만들었습니다.
파일> 새로 만들기> 프로젝트 …> 설치됨> 템플릿> Visual C ++> 테스트> 네이티브 단위 테스트 프로젝트>
이름 : UnitTest1
솔루션 : 솔루션에 추가
그런 다음 위치가 현재 열려있는 솔루션의 경로로 자동 전환되었습니다. 솔루션의 폴더 구조입니다.
unittest1.cpp 파일 만 편집했습니다.
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestEqual)
{
Assert::AreEqual(multiple(2, 3), 6);
// TODO: Your test code here
}
};
}
하지만 오류 LNK2019 : 해결되지 않은 외부 기호가 표시됩니다. 함수 다중 구현 이 누락 되었음을 알고 있습니다. function.cpp 파일을 삭제하려고했고 선언을 정의로 바꾸고 실행했습니다. 그러나 동일한 파일에 선언과 정의를 모두 작성하는 것은 권장되지 않습니다. 그렇게하지 않고 어떻게이 오류를 수정할 수 있습니까? #include "../MyProjectTest/function.cpp"
unittest.cpp 파일에서로 바꿔야 합니까?
(저는 영어를 잘 못합니다. 감사합니다)
답변
한 가지 옵션은 프로젝트 에 포함 function.cpp
하는 UnitTest1
것이지만 가장 이상적인 솔루션 구조는 아닐 수 있습니다. 문제에 대한 짧은 대답은 UnitTest1
프로젝트를 빌드 할 때 컴파일러와 링커가 function.cpp
존재 하는지 전혀 모르고 multiple
. 이를 수정하는 방법은 링크 라이브러리를 사용하는 것입니다.
단위 테스트가 다른 프로젝트에 있기 때문에 해당 프로젝트를 독립 실행 형 단위 테스트 프로그램으로 만드는 것이 의도라고 가정합니다. 테스트중인 함수가 다른 프로젝트에 있으면 해당 프로젝트를 동적 또는 정적으로 연결된 라이브러리로 빌드 할 수 있습니다. 정적 라이브러리는 빌드시 다른 프로그램에 링크되며 확장자 .lib
가이고 동적 라이브러리는 런타임에 링크되며 확장자가 .dll
. 내 대답에는 정적 라이브러리를 선호합니다.
프로젝트 속성에서 변경하여 첫 번째 프로그램을 정적 라이브러리로 전환 할 수 있습니다. 프로젝트가 실행 파일 ( .exe
) 로 빌드되도록 설정된 일반 탭 아래에 옵션이 있어야합니다 . 이것을로 변경할 수 있습니다 .lib
. .lib
파일은 같은 장소에 구축 할 것입니다 .exe
.
당신의에서 UnitTest1
프로젝트, 해당 속성에 갈 수 있고, 카테고리 추가 라이브러리 디렉토리에서 링커 탭 아래에있는에 경로 추가 MyProjectTest
빌드를. 그런 다음 링커-입력 탭 아래의 추가 종속성에 대해 정적 라이브러리의 이름을 추가합니다 MyProjectTest.lib
.
그러면 프로젝트를 빌드 할 수 있습니다. 이렇게하면 MyProjectTest
필요에 따라 빌드 속성을 변경하지 않는 한은 독립 실행 형 실행 프로그램이 아닙니다. 이는 이상적이지 않습니다.
답변
Visual Studio 솔루션 트리에서 ‘UnitTest1’프로젝트를 마우스 오른쪽 버튼으로 클릭 한 다음 추가-> 기존 항목-> 파일 ../MyProjectTest/function.cpp 선택
답변
내 프로젝트를 독립 실행 형 EXE로 컴파일하기를 원하기 때문에 UnitTest 프로젝트를 function.cpp에서 생성 된 function.obj 파일에 연결하고 작동합니다. ‘UnitTest1’프로젝트> 구성 속성> 링커> 입력> 추가 종속성> “.. \ MyProjectTest \ Debug \ function.obj”추가를 마우스 오른쪽 버튼으로 클릭합니다.
답변
방금 Visual Studio 2013에서이 문제가 발생했습니다. 지금은 동일한 솔루션에 두 개의 프로젝트가 있고 종속성을 설정하는 것만으로는 충분하지 않습니다. 그들 사이에 프로젝트 참조를 추가해야합니다. 하기 위해서:
- 솔루션 탐색에서 프로젝트를 마우스 오른쪽 단추로 클릭하십시오.
- 추가 => 참조 …를 클릭하십시오.
- 새 참조 추가 버튼을 클릭합니다.
- 이 프로젝트가 의존하는 프로젝트의 확인란을 선택하십시오.
- 확인 클릭
답변
.c 파일을 .cpp 파일과 함께 사용하고 있다는 것이 밝혀졌습니다. .c를 .cpp로 이름을 바꾸면 문제가 해결되었습니다.
답변
이 링커 오류를 얻을 수있는 또 다른 방법 은 dll에서 클래스 의 인스턴스 를 내보내 지만 해당 클래스 자체를 가져 오기 / 내보내기로 선언하지 않은 경우입니다.
#ifdef MYDLL_EXPORTS
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class DLLEXPORT Book // <--- this class must also be declared as export/import
{
public:
Book();
~Book();
int WordCount();
};
DLLEXPORT extern Book book; // <-- This is what I really wanted, to export book object
따라서 주로 위에서 호출 된 Book 클래스 의 인스턴스 만 내보내고 있었지만 클래스를 내보내기 / 가져 오기 클래스로 book
선언해야했습니다. Book
그렇지 않으면 book.WordCount()
다른 dll에서 호출 하면 링크 오류가 발생했습니다.
답변
이것은 나에게 일어 났으므로 내 솔루션을 다음과 같이 간단하게 공유 할 수 있다고 생각했습니다.
구성 속성 -> 일반 -> 문자 집합 에서 두 프로젝트의 문자 집합을 확인합니다.
내 UnitTest 프로젝트는 기본 문자 세트 멀티 바이트를 사용 하고 내 libs는 Unicode .
내 함수는 TCHAR 를 매개 변수 로 사용했습니다 . 내 LIB의 결과 내 TCHAR는 한 변형 에 WCHAR 그러나 그것은이었다 숯불 * 내 유닛 테스트에서 : 매개 변수가 결국 정말 동일하지 않았기 때문에 기호가 달랐다.