Проблема связывания C ++ в Visual Studio 2008 при объединении разных проектов в одном решении - PullRequest
4 голосов
/ 24 марта 2010

Я использую Google Test Framework для установки некоторых модульных тестов. У меня есть три проекта в моем решении:

  • FN (мой проект)
  • FN_test (мои тесты)
  • gtest (Google Test Framework)

Я установил FN_test для FN и gtest в качестве ссылок (зависимостей), а затем я думаю, что я готов настроить свои тесты (я уже установил всех на / MTd (отказ от этого привел меня к ссылкам на ошибки) раньше)).

В частности, я определяю класс с именем Embark в FN, который я хотел бы проверить с помощью FN_test. Все идет нормально. Таким образом, я пишу класс с именем EmbarkTest с помощью googletest, объявляю член Embark * и пишу внутри конструктора:

EmbarkTest() {
  e = new Embark(900,2010);
}

Затем, нажав F7, я получаю следующее:

1>FN_test.obj : error LNK2019: unresolved external symbol "public: __thiscall Embark::Embark(int,int)" (??0Embark@@QAE@HH@Z) referenced in function "protected: __thiscall EmbarkTest::EmbarkTest(void)" (??0EmbarkTest@@IAE@XZ) 1>D:\Users\lg\Product\code\FN\Debug\FN_test.exe : fatal error LNK1120: 1 unresolved externals

Кто-то знает, что я сделал неправильно и / или что я могу сделать, чтобы уладить это?

РЕДАКТИРОВАТЬ : Соответствует код от Embark.h

class Embark
{
public:

   //Constructor for initial state
   Embark(int _id, int _year);
   //Destructor
   ~Embark();   
/* ... */
}

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

Я нашел ответ довольно простым. После двух дней интенсивного головокружения, это так:

Вы должны скомпилировать свой основной проект как .lib, а не .exe

После этого все ссылки стали блаженством. Я думал, что Visual Studio сделает это автоматически для меня, так как я объявил зависимость от FN от FN_test: я предполагал, что Visual Studio создаст библиотеки. Это не так.


RANT (после этого читать не нужно)
Поскольку довольно редко можно связать один проект, который делает исполняемый файл, с другим, который делает то же самое, найти ссылки на этот вид проблемы было довольно сложно. Поиск в Google не дал мне никаких полезных результатов. Форумы MSDN также были бесполезны.

Но когда вы проводите модульное тестирование в приложении, будет ли обычным явление, когда, скажем, тестовый проект и проект приложения в одном решении? У меня нет знаний о других средах тестирования для C ++. Я выбрал Google Test Framework для:

  1. В Google мы верим
  2. Отличная документация
  3. Очень прост в использовании и понимании

Но, тем не менее, он не имеет особых преимуществ по интеграции. Я думаю, что другие инструменты лучше интегрируются в Visual Studio, включая отзывчивость IDE. Но я предпочел страдать сейчас, чем потом. Я надеюсь, что этот инструмент продолжает улучшаться, потому что он мне понравился.

1 голос
/ 24 марта 2010

Компоновщик не может найти Embark::Embark(int, int)

Вот что MSDN говорит об ошибке LNK2019 .

1 голос
/ 24 марта 2010

Компоновщик не может найти определение конструктора Embark.

  • Вы уже определили этот конструктор где-нибудь?
  • Действительно ли ваш тестовый проект связан с библиотекой FN?
...