10 ответов:
одним из вариантов было бы включить
function.cppв своемUnitTest1проект, но это может быть не самая идеальная структура решения. Короткий ответ на вашу проблему заключается в том, что при создании вашегоUnitTest1проект, компилятор и компоновщик понятия не имеют, чтоfunction.cppсуществует, а также не имеют ничего, чтобы связать, что содержит определениеmultiple. Способ исправить это-использовать библиотеки ссылок.поскольку ваши модульные тесты находятся в другом проекте, я предполагаю, что ваше намерение состоит в том, чтобы сделайте этот проект автономной программой модульного тестирования. С функциями, которые вы тестируете, расположенными в другом проекте, можно построить этот проект в динамически или статически связанной библиотеке. Статические библиотеки связаны с другими программами во время сборки, и имеют расширение
.lib, и динамические библиотеки связаны во время выполнения, и имеют расширение.dll. Для моего ответа я предпочитаю статические библиотеки.вы можете превратить свою первую программу в статическую библиотеку изменив его в свойствах проектов. Там должна быть опция на вкладке Общие, где проект настроен на сборку в исполняемый файл (
.exe). Вы можете изменить это на.lib. Элемент.libфайл будет построен в том же месте, что и.exe.в своем
UnitTest1проект, вы можете перейти к его свойствам, и на вкладке Компоновщик в категории дополнительные каталоги библиотеки, добавить путь к которомуMyProjectTestстроит. Затем, для получения дополнительных зависимостей под Компоновщик - Вкладка ввода, добавьте имя вашей статической библиотеки, скорее всегоMyProjectTest.lib.это должно позволить вашему проекту построить. Обратите внимание, что, делая это,
MyProjectTestне будет автономной исполняемой программой, если вы не измените ее свойства сборки по мере необходимости, что было бы менее идеальным.
в дереве решений Visual Studio щелкните правой кнопкой мыши на проекте "UnitTest1", затем добавьте -> существующий элемент -> выберите файл ../MyProjectTest / функция.cpp
Так как я хочу, чтобы мой проект компилировался в автономный EXE, я связал UnitTest проект с функцией.obj файл, созданный из функции.cpp и это работает. Щелкните правой кнопкой мыши на проекте 'UnitTest1' > свойства конфигурации > Компоновщик > ввод > дополнительные зависимости > добавить "..\MyProjectTest\Debug\function.obj"
Я только что столкнулся с этой проблемой в Visual Studio 2013. По-видимому, теперь, имея два проекта в одном решении и устанавливая зависимости, недостаточно. Вам нужно добавить ссылку на проект между ними. Для этого:
- щелкните правой кнопкой мыши на проекте в решении explore
- Нажмите Добавить = > Ссылки...
- Нажмите кнопку Добавить новую ссылку
- установите флажки для проектов, которые использует этот проект на
- Нажмите кнопку ОК
другой способ, которым вы можете получить эту ошибку компоновщика (как и я), если вы экспортируете экземпляр класса из 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.WordCount()в другой dll вызывал ошибку ссылки.
Я только что обнаружил, что
LNK2019происходит во время компиляции в Visual Studio 2015, если забыли предоставить определение для объявленной функции внутри класса.ошибка компоновщика была очень загадочной, но я сузил то, что отсутствовало, прочитав ошибку и предоставил определение вне класса, чтобы прояснить это.
для меня работает, если я добавлю эту строку ниже в
.vcxprojinitemGroupcpp файл, который подключен к заголовочному файлу.<ClCompile Include="file.cpp" />
Это случилось со мной, поэтому я подумал, что могу поделиться своим решением, так просто, как это было:
Проверьте набор символов обоих проектов в Свойства Конфигурации ->общие ->Набор Символов
мой UnitTest проект использовал набор символов по умолчанию Мульти-Байт в то время как мои libs где в Unicode.
Моя функция была с помощью TCHAR в качестве параметра. В результате в моей lib мой TCHAR был преобразовано на WCHAR но это char* на моем UnitTest: символ был другим, потому что параметры были действительно не то же самое в конце концов.
в Visual Studio 2017 если вы хотите протестировать общедоступные члены, просто поместите свой реальный проект и тестовый проект в одно и то же решение и добавьте ссылку на свой реальный проект в тестовом проекте.
посмотреть модульное тестирование C++ в Visual Studio из блога MSDN для получения более подробной информации. Вы также можете проверить написать модульные тесты для C / C++ в Visual Studio а также используйте платформу модульного тестирования Microsoft для C++ в Visual Studio, причем если вам нужно протестировать непубличных членов и нужно поместить тесты в тот же проект, что и ваш реальный код.
обратите внимание, что вещи, которые вы хотите протестировать должны быть экспортированы с помощью
__declspec(dllexport). Смотрите экспорт из DLL с помощью _ _ declspec (dllexport) для более подробной информации.

Comments