2015-07-04 3 views
2

Мое решение состоит из трех проектов: GoogleTest (для использования Google Test), Vi (для большей части логики) и ViTests (для модульных тестов с использованием Vi). Проект ViTests ссылается на проект Vi и проект Google Test.Ошибка компоновщика при определении функции в файле cpp

Vi имеет следующий код в v1.h

#pragma once 

namespace Vi 
{ 
    class Vi1 
    { 
    public: 
     int SomeInt(); 
    }; 
} 

и согласующий v1.cpp

#include "vi1.h" 

namespace Vi 
{ 
    int Vi1::SomeInt() 
    { 
     return 123; 
    } 
} 

Функция испытания в ViTests следует

TEST(Vi1Foo, SomeIntIsSame) 
{ 
    Vi1 v = Vi1{}; 
    EXPECT_EQ(123, v.SomeInt()); 
} 

ошибка линкера говорит есть неразрешенный символ SomeInt. Тем не менее, я могу сделать ошибку линкера уйти от встраивания функции, как так:

namespace Vi 
{ 
    class Vi1 
    { 
    public: 
     int SomeInt() { return 123; } 
    }; 
} 

Почему тестовый проект модуля не находит определение SomeInt функции, когда она расположена в отдельном файл CPP?

Спасибо.

Дополнительные детали упаковывают полезные: Я использую Visual Studio 2015.

Сообщения об ошибке:

Error LNK2019 unresolved external symbol "public: int __thiscall Vi::Vi1::SomeInt(void)" ([email protected]@[email protected]@QAEHXZ) referenced in function "private: virtual void __thiscall ViTests::Vi1Foo_SomeIntIsSame_Test::TestBody(void)" ([email protected][email protected]@@EAEXXZ) Vi_Tests C:\Users\MyName\Vi\Vi_Tests\Vi_Tests.obj 1 

Типы проектов: Vi является приложением Win32, ViTests является консольным приложением Win32, GoogleTest является статическая библиотека.

+0

Вы ссылаетесь на файл с определением функции? –

+0

Я не знаю, что вы имеете в виду. Я должен включить имя файла cpp в список «дополнительных зависимостей»? –

+0

Как я могу связать файл с определением функции? –

ответ

2

Я работал под глупым ложным предположением. Я предполагал, что VS просто запустит файлы cpp, потому что я ссылался на содержащий их проект, включая правильные файлы заголовков, но это не так.

nabijaczleweli сказал, что я должен ссылаться «на файл с определением функции». После небольшого изучения онлайн я узнал, как это сделать. Я нашел this сообщение, изложив решение. Файлы cpp сами должны быть добавлены в тестовый проект. Это было сделано, щелкнув правой кнопкой мыши на ViTests, выбрав «Добавить существующие файлы» и выбрав vi1.cpp.

Это сработало, но я был очень недоволен этим решением, потому что мне пришлось добавлять эти файлы по мере необходимости. Я обнаружил, что могу обойти это, меняя тип проекта Vi на статическую библиотеку. Это описано here. Комментарий Майкла Берра описывает способ связывания с объектными файлами, которые также будут работать.

Я бы так не подумал об этом без помощи плакатов в этой теме. Большое вам спасибо.

1

Вы не указали, каков тип проектов. Я предполагаю, что это библиотеки DLL, и поэтому такие не-встроенные функции или классы, которые вы хотите использовать вне их, должны экспортироваться: либо объявлены как __declspec (dllexport) в источнике или указаны в файле DEF.

Если вы идете с __declspec (dllexport), помните __declspec (dllimport) функции в проекте-потребителе. Обычно это достигается с помощью макроса, используемого в качестве классификатора в файле .h, который по-разному решается в разных проектах.

+0

Но разве он не должен был знать, к какому классу принадлежит метод? Я попытался удалить его в любом случае, но ошибка сохранилась. Но спасибо за идею :) –

+0

Мой плохой - я пропустил «1» в Vi1. Удаление ответа скоро –

+0

Я не рассматривал типы проектов. Я обновлю свой ответ, чтобы включить эту информацию, потому что я думаю, что это может быть многообещающим. –

Смежные вопросы