Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
1

LNK2019 два проекта в одном решении (MSVC gtest)

09.09.2015, 17:43. Показов 3484. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно собрал gtest 1.7.0 static debug с ключом /MTd.
Создал решение. Добавил в него проект, в котором есть функтор
C++
1
2
3
4
5
class Factorial
{
public:
    int operator()(int n);
};
C++
1
2
3
4
5
6
7
8
9
10
11
#include "Factorial.h"
 
int Factorial::operator()(int n)
{
    int result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
 
    return result;
}
Добавил ещё 1 проект к решению.
В нём указал дополнительные включение (gtest/include и путь к первому проекту), библиотеки (путь к собраным статическим библиотекам) и зависимости (gtestd.lib и gtest_maind.lib). Также добавил ссылку к первому проекту.
Все проекты в решении собираются с ключом /MTd
Создал исходник
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "gtest/gtest.h"
#include "Factorial.h"
 
 
// Проверить факториал от 0.
TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(1, Factorial()(0));
}
 
// Проверить факториал некоторых положительных значений.
TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(1, Factorial()(1));
    EXPECT_EQ(2, Factorial()(2));
    EXPECT_EQ(6, Factorial()(3));
    EXPECT_EQ(40320, Factorial()(8));
}
В итоге 2 проект не собирается.
Ошибка
error LNK2019: unresolved external symbol "public: int __thiscall Factorial::operator()(int)" (??RFactorial@@QAEHH@Z) referenced in function "private: virtual void __thiscall FactorialTest_HandlesPositiveInput_Test::TestBody(void)" (?TestBody@FactorialTest_HandlesPositiveInput_Test@@EAEXXZ)
Что я сделал не так?
P.S: если объявлять определение оператора() в заголовочном файле, то проблем нет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2015, 17:43
Ответы с готовыми решениями:

Получить доступ к проекту из другого проекта в одном решении
В решении Solution1 имеется несколько проектов: Project1, Project2. В Project1 имеется папка Forms...

В решении два проекта
Всем привет!) В моем решении добавлено два проекта, как мне вызвать форм1 из второго проекта? То...

Два проекта в решении
доброго времени суток! Такой вопрос: есть солюшн в VS 2019 с двумя проектами. Один -...

Как подключить к проекту класс из другого проекта, если эти проекты находятся в одном решении
В одном проекте описан класс Extension Расширяюшие методы) как его подключить к другому проекту)

8
Заблокирован
09.09.2015, 17:55 2
C++ Tutorial - Google Test (gtest)
Google Test in Visual Studio 2012
0
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
09.09.2015, 18:32  [ТС] 3
IrineK, в msvc 2015 есть поддержка шаблонов с переменным числом аргументов поэтому нет необходимости собирать с _VARIADIC_MAX=10 как сказано здесь
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2015, 18:42 4
Цитата Сообщение от xEmpire Посмотреть сообщение
Также добавил ссылку к первому проекту.
не очевидно, что такое "ссылка к первому проекту".

обычно делают так:
1 проект - это библиотека (.lib),
функционал которой нужно тестировать.

2 проект - это запускаемое приложение,
которое содержит тесты ( .exe )

второй проект линкуется с gtest: gtestd.lib и gtest_maind.lib
а так же с библиотекой, которую нужно протестировать: factorial.lib

в вашем случае вы не указатели,
что нужно слинковаться с factorial.lib
Цитата Сообщение от xEmpire Посмотреть сообщение
error LNK2019: unresolved external symbol "public: int __thiscall Factorial::operator()(int)" (??RFactorial@@QAEHH@Z) referenced in function "private: virtual void __thiscall FactorialTest_HandlesPositiveInput_Test::TestBody(void)" (?TestBody@FactorialTest_HandlesPositiveInput_Test@@EAEXXZ)
тестируемая библиотека factorial.lib не была слинкованна
и поэтому, тестовое проект видит хэдэры,
но не видет туловища тестируемой библиотеки



в вижал студии вы можете указать,
что проект тестов зависит от проекта тестируемой библиотеки.
тогда при изменении этой библиотеки,
будет автоматически перекомпилированно все что нужно.
0
Заблокирован
09.09.2015, 18:42 5
Цитата Сообщение от xEmpire Посмотреть сообщение
в msvc 2015 есть поддержка шаблонов
Вы не указали версию msvc в первом посте.
Теперь мы её знаем. Спс.
0
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
09.09.2015, 19:51  [ТС] 6
Собрал gtest-1.7.0\msvc\gtest.sln c ключом /MTd (следующие проекты создаются с таким же ключом)
Получил на выходе папку gtest\Debug с содержимым.
Создал решение (solution), в котором создал обычное консольное приложение с функтором и main.
Добавил к решению проект FirtUnitTest. добавил исходник и настроил проект с такими настройками:
Миниатюры
LNK2019 два проекта в одном решении (MSVC gtest)   LNK2019 два проекта в одном решении (MSVC gtest)   LNK2019 два проекта в одном решении (MSVC gtest)  

LNK2019 два проекта в одном решении (MSVC gtest)  
0
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
09.09.2015, 20:04  [ТС] 7
Сам проект
Вложения
Тип файла: 7z FirtUnitTest.7z (4.23 Мб, 1 просмотров)
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2015, 21:41 8
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

xEmpire,

выбросьте этот хлам в мусорку на время.

далее, по шагам простой пример:

1.
создайте проект "статическая библиотека".
назовите её "example".

путь у неё будет всего два файла,
которые реализуют одну единственную функцию:
example.h
C++
1
2
#pragma once
int example();
и example.cpp
C++
1
2
#include "example/example.h"
int example() { return 1; }
2.
скомпилируйте библиотеку.
у вас на выхлопе должна получится библиотека example.lib

3.
убедившись, что библиотека успешно собирается,
создавайте ещё один проект "запускаемое приложение".

назовите его "unit-test"

4.
в настройках проекта укажите пути к хэдэрам gtest
5.
в настройках проекта укажите пути к библиотекам gtest
и имена этих библиотек.
6.
в настройках проекта укажите пути к хэдэрам example
7.
в настройках проекта укажите пути к библиотеке example
и имя example.lib.

8.
добавьте в проект файл unit-test.cpp с таким содержанием:

C++
1
2
3
4
5
6
7
#include "gtest/gtest.h"
#include "example/example.h"
  
TEST(NameOfCase, NameOfTest ) 
{
    EXPECT_EQ(1, example() );
}
9.
в солюшене проекта поставьте галочку, что проект unit-test зависит от проекта example
теперь при изменении кода example, unit-test будет пересобираться

10.
в солюшене проекта укажите, что unit-test должен быть старующим проектом.

11.
нажмите ctrl-f5
1
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
09.09.2015, 23:56  [ТС] 9
hoggy, спасибо.
Всё сводится к статической библиотеке.
P.S: в 7 пункте можно просто ссылаться на проект, который тестируем (проверено).
тогда в проекте с модульным тестированием не будет необходимости прописывать в настройках путь к библиотеке и добавлять вручную внешнюю зависимость.
Тогда остается лишь укоротить путь к подключаемому заголовку с внешнего проекта
C++
1
#include "example.h"
0
09.09.2015, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2015, 23:56
Помогаю со студенческими работами здесь

Как запустить сразу два проекта в решении (серверная часть и клиентская)
Я не силен пока в терминологии... так что если что извиняйте... но вообщем суть такая есть есть...

Могут ли в решении два проекта компилироваться одновременно при сборке решения?
13.Могут ли в решении два проекта компилироваться одновременно при сборке решения?

Два проекта в одном(взаимодействие)
Как взаимодействовать с другим проектом? Если возможно. В проект WinForm я добавляю еще проект...

Развернуть два Asp.Net Core проекта на одном домене
Добрый день, подскажите пожалуйста возможно ли разместить два Asp.Net Core проекта на одном домене?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru