Как решить ошибку LNK2019: неразрешенный внешний символ-функция?



я получаю эту ошибку, но я не знаю как это исправить.



я использую Visual Studio 2013. Я сделал имя решения MyProjectTest
Это структура моего тестового решения:



The structure



-

14685   10  

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"

оказалось, что я использовал .c файлов с .cpp-файлы. переименование. С до .cpp решил мою проблему.

Я только что столкнулся с этой проблемой в Visual Studio 2013. По-видимому, теперь, имея два проекта в одном решении и устанавливая зависимости, недостаточно. Вам нужно добавить ссылку на проект между ними. Для этого:

  1. щелкните правой кнопкой мыши на проекте в решении explore
  2. Нажмите Добавить = > Ссылки...
  3. Нажмите кнопку Добавить новую ссылку
  4. установите флажки для проектов, которые использует этот проект на
  5. Нажмите кнопку ОК

другой способ, которым вы можете получить эту ошибку компоновщика (как и я), если вы экспортируете экземпляр класса из 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, если забыли предоставить определение для объявленной функции внутри класса.

ошибка компоновщика была очень загадочной, но я сузил то, что отсутствовало, прочитав ошибку и предоставил определение вне класса, чтобы прояснить это.

для меня работает, если я добавлю эту строку ниже в .vcxproj in itemGroup cpp файл, который подключен к заголовочному файлу.

<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

    Ничего не найдено.