Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Visual Studio и зависимость проектов 
:(
    Опции темы
ANTON_AL
Дата 11.7.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброго дня!

У меня такой вот вопрос.


Есть система автоматического тестирования, написанная мною. Под эту систему создан проект.
Вкратце вид этой системы такой:


TestSuite.h      (#include Test.h)
TestSuite.cpp   (#include TestSuite.h)
Test.h               
Test.cpp

TestSuite - это фасад системы тестирования, у когорого есть метод RunTests( ) и реализована фабрика классов производных от Test.

Классы TestSuite и Test являются базовыми.
Всё это лежит в проекте TestSuite


Пользователь этой системы должен будет создать проект, например "SomeTestSuite". Создать класс SomeTestSuite, который будет наследоваться от класса TestSuite(фасад). И создать некое множество тестов, каждый из которых будет наследоваться от класса Test.


Так вот. В пользовательском проекте SomeTestSuite включаются файлы базовых классов TestSuite и Test. И потом, от них проиходит наследование, и. т. д...

Теперь сама проблема:
В проекте "SomeTestSuite" ( т.е. в проекте пользователя ) возникает ошибка такого плана: Error 17 error LNK2005: "public: bool __thiscall TestSuite::RunTests( )
Т.е. из за того, что в проекте включается только .h - файл, .cpp файл остаётся невидим для пользовательского проекта, т.к. он находится в другом проекте "TestSuite".
Если я устанавливаю Project Dependences, в настройках Solution->ProjectDependences: это никак не помогает.

Единственный способ - это включать пару файлов h/cpp в пользовательский проект. Как этого избежать??
И ещё вопрос, обладает ли транзитивностью зависимость проетов ?? ( Т.е. если проект A зависит от B, a B от C, то A должен зависеть от C )


PM MAIL   Вверх
Fazil6
Дата 11.7.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 3
Всего: 60



Цитата(ANTON_AL @  11.7.2007,  15:18 Найти цитируемый пост)
И ещё вопрос, обладает ли транзитивностью зависимость проетов ?? ( Т.е. если проект A зависит от B, a B от C, то A должен зависеть от C )

да, вернее не должен , а будет зависеть, т.е . при компилляции А будет компилироваться С, потом В и потом А, но явно указывать в настройках , что A зависит от С не нужно

Цитата(ANTON_AL @  11.7.2007,  15:18 Найти цитируемый пост)
Единственный способ - это включать пару файлов h/cpp в пользовательский проект. Как этого избежать??

выделить реализацию в статическую библиотеку и подключать ее вместе с хедерами во все необходимые проекты


Это сообщение отредактировал(а) Fazil6 - 11.7.2007, 15:27
PM MAIL   Вверх
Daevaorn
Дата 11.7.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(ANTON_AL @  11.7.2007,  16:18 Найти цитируемый пост)
Есть система автоматического тестирования, написанная мною.

системы писать научились, а раздел форума правильно выбирать - нет. жаль.
PM MAIL WWW   Вверх
ANTON_AL
Дата 11.7.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



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

Error    7    fatal error C1083: Cannot open precompiled header file: 'Debug\TestSuite.pch': No such file or directory    test.cpp    20

Каким образом надо включать stdafx.h и stdafx.cpp в файлы библиотеки ?? Студия требует, чтобы я включал stdafx.h в файлы .cpp Но это от ошибки не избавляет
PM MAIL   Вверх
Sartorius
Дата 11.7.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 В свойствай проекта -> C/C++ -> Precompiled headers убери их 
PM MAIL ICQ   Вверх
ANTON_AL
Дата 11.7.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Спасибо всем, всё заработало. smile 


Только вот по поводу зависимоти проектов: транзитивность у меня пока не наблюдается. Общий вид зависимостей таков:
(--> зависимость )

TestSuite--->ProjectA
               --->ProjectB

MyTestSuite-->TestSuite
                   -->ProjectA
                   -->ProjectB

Только при такой конфигурации работает. Если делаю так: MyTestSuite-->TestSuite, в надежде на присутствие транзитивности, то вылазиет куча ошибок
PM MAIL   Вверх
Fazil6
Дата 11.7.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 3
Всего: 60



Цитата(ANTON_AL @  11.7.2007,  17:47 Найти цитируемый пост)
Только при такой конфигурации работает

что работает? Чего ты хочешь добиться?

Цитата(ANTON_AL @  11.7.2007,  17:47 Найти цитируемый пост)
Если делаю так: MyTestSuite-->TestSuite, в надежде на присутствие транзитивности, то вылазиет куча ошибок

каких ошибок?
Твои проекты в одном солюшене?
PM MAIL   Вверх
ANTON_AL
Дата 11.7.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



проект TestSuite - это статическая библиотека, в которую включены(через Add-->ExistingProject ) ещё два проекта A и B, которые тоже являются статическими библиотеками. Т.е. TestSuite зависит от двух проектов A и B

Далее я создаю Solution, например MyTestSuite и добавляю в него проект TestSuite ( Add-->ExistingProject ), т.е. я использую написанную библиотеку TestSuite. 
При такой конфигурации возникают ошибки Error 2019 Unresolved External Symbol, которые ругаются как раз на те две библиотеки A и B, от которых зависит уже подключённая TestSuite. Т.е. это ошибки, когда у всех функций в проектах A и B не видна реализация(тело).

А когда я в добавок к вышеописанной конфигурации подключаю таким же обазом проекты A и B, всё прекрасно работает.

Добиться я хочу того, чтобы достаточно было подключить только проект TestSuite, который является front-end подсистемы тестирования, но пока этого сделать не могу и приходится подключать помимо front-end ещё и внутренности подсистемы тестирования, что очень не удобно, и не сохраняет инкапсуляцию.
Жду вашей помощи.

Это сообщение отредактировал(а) ANTON_AL - 11.7.2007, 19:44
PM MAIL   Вверх
Fazil6
Дата 11.7.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 3
Всего: 60



для указания зависимости проектов вообще-то используется ProjectDependencies, но это в рамках солюшена делается и поэтому проекты должны быть подключены все.
Тебе по всей видимости надо всетаки разнести  TestSuite+ProjectA+ProjectB и MyTestSuite и к последнему дать пути к хедерам и линковать только lib файл. Естественно компиллироваться это будет раздельно. 
Ты же сам хочешь вынести реализацию TestSuite+ProjectA+ProjectB отдельно от MyTestSuite... 
Я честно говоря не совсем понимаю зачем тебе зависимость MyTestSuite от TestSuite+ProjectA+ProjectB если ты реализацию скрыть хочешь.  Зависимость имеет смысл когда ты все проекты имеешь в одном солюшене и работаешь с ними и при изменении TestSuite+ProjectA+ProjectB тебе надо пересобрать автоматом MyTestSuite, но если как я понял, ты отдаешь куда-то на сторону либу, то связи-то нет, а если все у тебя, то делай все в одном солюшене и будут у тебя   все ProjectDependencies, только галки проставляй
PM MAIL   Вверх
ANTON_AL
Дата 12.7.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @  11.7.2007,  20:03 Найти цитируемый пост)
Тебе по всей видимости надо всетаки разнести  TestSuite+ProjectA+ProjectB и MyTestSuite и к последнему дать пути к хедерам и линковать только lib файл.


У меня вот такая ситуация:

ProjectA( lib )       ProjectB( lib )
        \                    /
          \                 /
           TestSuite( lib )
                   |
                   |
                   |
           MyTestSuite

MyTestSuite использует библиотеку TestSuite, и некоторые классы из ProjectA, ProjectB. Чтобы линкер видел всё это добро, надо включить в MyTestSuite все три проекта.

Но, если, например, рассмотреть такую же ситуацию, с подключением файлов с помощью #include:
          Class1.h     Class2.h
                  \             /
                    \          /
                     Class3.h
                           |
                           |
                   Application.h

Чтобы из Application.h были видны все три класса, достаточно подключить лишь Class3, который в свою очередь подключит остальные два.

Есть ли такая аналогия при подключении статических библиотек ?? В этом основная суть моего вопроса.
PM MAIL   Вверх
Fazil6
Дата 12.7.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 3
Всего: 60



Цитата(ANTON_AL @  12.7.2007,  12:48 Найти цитируемый пост)
Есть ли такая аналогия при подключении статических библиотек ?? В этом основная суть моего вопроса.

ну так в этом и есть смысл lib
Для того чтобы подключить к MyTestSuite то, что ты разработал и реализовал в TestSuite( lib )  тебе нужны только хедеры, в которых объявлено то, что ты хочешь использовать и сам скомпилированный lib проекта TestSuite. Все. Проекты подключать никуда не нужно.

1. Положи все необходимые хедеры в отдельное место, удобное для доступа из проектов солюшена TestSuite и солюшена MyTestSuite.
2. Где-то там же задать место куда должен витоге TestSuite класть свой lib при сборке TestSuite (Properties->Librarian->OutputFile)
3. В проекте MyTestSuite указываешь Properties->Linker->Input->Additional Dependencies файл твоей либы и в Properties->Linker->General->Additional Library Directories указываешь путь в каталог, куда этот файл кладется при компилляции TestSuite
4. Все, что в хедерах объявлено можно теперь использовать. Реализацию линкер будет брать из либы.

вот и все.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.