Почему я все еще получаю ошибку «неразрешенный внешний символ» после добавления ссылки на тестовый проект? - PullRequest
2 голосов
/ 12 апреля 2020

Я создал проект C ++ в Visual Studio 2019. Я добавил к нему два файла: MyClass.hpp и MyClass.cpp. Затем я создал тестовый проект и добавил исходный проект в качестве ссылки.

Если дважды щелкнуть ссылку в тестовом проекте, я вижу MyClass. Но если я пытаюсь запустить тесты, я получаю эту ошибку:

MyTest.obj : error LNK2019: unresolved external symbol "public: struct MyRef __thiscall MyClass::SetData(struct Data)" (?SetData@MyClass@@QAE?AUMyRef@@UData@@@Z) referenced in function "private: virtual void __thiscall MyTest_SetData_Test::TestBody(void)" (?TestBody@MyTest_SetData_Test@@EAEXXZ)

Что я не так делаю? Почему MyClass.cpp не компилируется, даже если он находится в ссылочном проекте? Я могу построить оригинальный проект без ошибок. Я получаю сообщение об ошибке только при попытке построить тестовый проект.


Я столкнулся с этим вопросом о неразрешенной внешней ошибке символа , но она не решила мою проблему. Это проблема Visual Studio Speci c.

Если я добавлю MyClass.cpp в тестовый проект вручную, то это сработает. Но я не хочу делать это для каждого файла, потому что мой проект может иметь гораздо больше cpp исходных файлов, а не только этот. Я бы хотел, чтобы он работал, используя функцию «ссылки».

При создании тестового проекта я выбрал исходный проект в качестве ссылки.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2020

Добавление проекта B в проект A в качестве ссылки в основном просто гарантирует, что проект B компилируется при компиляции проекта A.

Вам необходима дополнительная настройка:

  1. убедитесь, что проект B сборка в виде библиотеки (а не исполняемого файла)
  2. учитывает два пути, доступные из обоих проектов. Это будет место, где будет установлена ​​библиотека проекта B. Это состоит из двух вещей:
    • двоичный файл (stati c библиотека является простейшей установкой)
    • заголовки библиотеки
  3. вкл При компиляции проекта B вам необходимо установить оба получаемых двоичных файла и заголовки по этим путям. Для этого вы можете сделать шаг после сборки, который скопирует необходимые файлы: Свойства »События сборки» Событие после сборки

    Поочередно просто используйте папку сборки проекта B и местоположение источника.

  4. в проекте A:

    • добавить путь заголовка к путям включения: Свойства »C / C ++» Общие »Дополнительные каталоги include
    • добавить библиотеку в список библиотек для ссылки: Свойства »Линкер» Входные данные »Дополнительные зависимости
    • добавить двоичный путь к поиску библиотеки линкера Свойства »Линкер» Общие »Дополнительные каталоги библиотек
1 голос
/ 28 апреля 2020

Просто чтобы добавить что-то к предыдущим комментариям / ответам:

Вы не упомянули, строите ли вы свой ссылочный проект в качестве библиотеки c или Dynami c.

Это можно установить, перейдя в Свойства проекта-> Общие-> Тип конфигурации

Обратите внимание, что если вы выберете Dynamic Library (.dll), ваши символы (такие как MyClass::SetData(struct Data)) не будут экспортироваться по умолчанию, и вы ' Мне нужно добавить ключевое слово __declspec(dllexport). Смотри здесь

...