Я получаю эту ошибку, но не знаю, как ее исправить.
Я использую 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: неразрешенный внешний символ. Я знаю, что реализация функции multiple отсутствует. Я попытался удалить файл function.cpp, заменил объявление определением, и он запустился. Но записывать декларацию и определение в одном файле не рекомендуется. Как я могу исправить эту ошибку без этого? Должен ли я заменить на#include "../MyProjectTest/function.cpp"
в файле unittest.cpp на?
(Я не очень хорошо говорю по-английски. Спасибо)
источник
.LIB
расширение файла. Чтобы усложнить ситуацию ... библиотеки динамической компоновки (т.е.*.DLL
) могут иметь сопутствующую библиотеку импорта, которая также имеет.LIB
расширение файла. В этой библиотеке импорта перечислены все преимущества, предоставляемые*.DLL
. Для получения дополнительной информации, пожалуйста, прочтите: Руководство для начинающих поОтветы:
Один из вариантов - включить его
function.cpp
в вашUnitTest1
проект, но это может быть не самая идеальная структура решения. Короткий ответ на вашу проблему заключается в том, что при создании вашегоUnitTest1
проекта компилятор и компоновщик понятия не имеют, чтоfunction.cpp
существует, а также не имеют ничего для ссылки, содержащей определениеmultiple
. Способ исправить это - использовать линковочные библиотеки.Поскольку ваши модульные тесты находятся в другом проекте, я предполагаю, что вы намерены сделать этот проект отдельной программой модульного тестирования. С тестируемыми функциями, расположенными в другом проекте, можно построить этот проект в динамически или статически подключаемой библиотеке. Статические библиотеки связаны с другими программами во время сборки и имеют расширение
.lib
, а динамические библиотеки подключаются во время выполнения и имеют расширение.dll
. В качестве ответа я предпочитаю статические библиотеки.Вы можете превратить вашу первую программу в статическую библиотеку, изменив ее в свойствах проекта. На вкладке «Общие» должна быть опция, в которой проект настроен на сборку в исполняемый файл (
.exe
). Вы можете изменить это на.lib
..lib
Файл будет строить на то же место, что и.exe
.В своем
UnitTest1
проекте вы можете перейти к его свойствам и на вкладке «Компоновщик» в категории «Дополнительные каталоги библиотеки» добавить путь, по которому выполняетсяMyProjectTest
сборка. Затем для дополнительных зависимостей на вкладке Linker - Input, скорее всего, добавьте имя своей статической библиотекиMyProjectTest.lib
.Это должно позволить вашему проекту построить. Обратите внимание, что в результате этого
MyProjectTest
программа не будет автономной исполняемой, если вы не измените ее свойства сборки по мере необходимости, что было бы не идеально.источник
В дереве решений Visual Studio щелкните правой кнопкой мыши проект «UnitTest1», затем «Добавить» -> «Существующий элемент» -> выберите файл ../MyProjectTest/function.cpp
источник
Поскольку я хочу, чтобы мой проект компилировался в автономный EXE-файл, я связал проект UnitTest с файлом function.obj, созданным из function.cpp, и он работает. Щелкните правой кнопкой мыши проект «UnitTest1»> Свойства конфигурации> Компоновщик> Вход> Дополнительные зависимости> добавьте «.. \ MyProjectTest \ Debug \ function.obj»
источник
Я только что столкнулся с этой проблемой в Visual Studio 2013. По-видимому, теперь недостаточно иметь два проекта в одном решении и установить зависимости. Между ними нужно добавить ссылку на проект. Для этого:
источник
оказалось, что я использовал файлы .c с файлами .cpp. переименование .c в .cpp решило мою проблему.
источник
Другой способ получить эту ошибку компоновщика (как и я) - это если вы экспортируете экземпляр класса из dll, но не объявили сам этот класс как импорт / экспорт.
Поэтому, хотя в первую очередь я экспортировал только экземпляр класса Book, названного
book
выше, мне пришлось объявить этотBook
класс как класс экспорта / импорта, а в противном случае вызовbook.WordCount()
другой библиотеки dll вызывал ошибку связи.источник
Это случилось со мной, поэтому я подумал, что могу поделиться своим решением, настолько простым, насколько оно было:
Проверьте набор символов обоих проектов в Configuration Properties -> General -> Character Set.
Мой проект UnitTest использует по умолчанию Character Set Multi-Byte в то время как мой LIBS , где в Unicode .
Моя функция использовала TCHAR в качестве параметра. В результате в моей библиотеке мой TCHAR был преобразован в WCHAR, но в моем UnitTest это был символ * : символы были разными, потому что в конечном итоге параметры действительно не совпадали .
источник
Я только что обнаружил это
LNK2019
происходит во время компиляции в Visual Studio 2015, если я забываю предоставить определение объявленной функции внутри класса.Ошибка компоновщика была очень загадочной, но я сузил то, чего не хватало, прочитав ошибку, и предоставил определение вне класса, чтобы прояснить это.
источник
в моем случае установите для файла cpp значение «Компилятор C / C ++» в свойстве -> общее разрешение ошибки LNK2019.
источник
Для меня работает, если я добавляю эту строку , приведенную ниже в
.vcxproj
вitemGroup
CPP файл, который подключен к заголовочному файлу.источник
В Visual Studio 2017, если вы хотите протестировать общедоступных участников, просто поместите свой настоящий проект и тестовый проект в одно решение и добавьте ссылку на свой реальный проект в тестовый проект.
Дополнительные сведения см. В разделе Модульное тестирование C ++ в Visual Studio в блоге MSDN. Вы также можете проверить Написание модульных тестов для C / C ++ в Visual Studio, а также Использовать Microsoft Unit Testing Framework для C ++ в Visual Studio. , последнее - в том случае, если вам нужно протестировать непубличные члены и нужно поместить тесты в один и тот же проект. как ваш настоящий код.
Обратите внимание, что то, что вы хотите протестировать, нужно будет экспортировать с использованием
__declspec(dllexport)
. Дополнительные сведения см. В разделе Экспорт из библиотеки DLL с использованием __declspec (dllexport) .источник