Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Visual Studio и зависимость проектов


Автор: ANTON_AL 11.7.2007, 15:18
Доброго дня!

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


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


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 )


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

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

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

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

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

системы писать научились, а раздел форума правильно выбирать - нет. жаль.

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

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 Но это от ошибки не избавляет

Автор: Sartorius 11.7.2007, 16:55
 В свойствай проекта -> C/C++ -> Precompiled headers убери их 

Автор: ANTON_AL 11.7.2007, 17:47
Спасибо всем, всё заработало. smile 


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

TestSuite--->ProjectA
               --->ProjectB

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

Только при такой конфигурации работает. Если делаю так: MyTestSuite-->TestSuite, в надежде на присутствие транзитивности, то вылазиет куча ошибок

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

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

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

каких ошибок?
Твои проекты в одном солюшене?

Автор: ANTON_AL 11.7.2007, 19:31
проект 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 ещё и внутренности подсистемы тестирования, что очень не удобно, и не сохраняет инкапсуляцию.
Жду вашей помощи.

Автор: Fazil6 11.7.2007, 20:03
для указания зависимости проектов вообще-то используется ProjectDependencies, но это в рамках солюшена делается и поэтому проекты должны быть подключены все.
Тебе по всей видимости надо всетаки разнести  TestSuite+ProjectA+ProjectB и MyTestSuite и к последнему дать пути к хедерам и линковать только lib файл. Естественно компиллироваться это будет раздельно. 
Ты же сам хочешь вынести реализацию TestSuite+ProjectA+ProjectB отдельно от MyTestSuite... 
Я честно говоря не совсем понимаю зачем тебе зависимость MyTestSuite от TestSuite+ProjectA+ProjectB если ты реализацию скрыть хочешь.  Зависимость имеет смысл когда ты все проекты имеешь в одном солюшене и работаешь с ними и при изменении TestSuite+ProjectA+ProjectB тебе надо пересобрать автоматом MyTestSuite, но если как я понял, ты отдаешь куда-то на сторону либу, то связи-то нет, а если все у тебя, то делай все в одном солюшене и будут у тебя   все ProjectDependencies, только галки проставляй

Автор: ANTON_AL 12.7.2007, 12:48
Цитата(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, который в свою очередь подключит остальные два.

Есть ли такая аналогия при подключении статических библиотек ?? В этом основная суть моего вопроса.

Автор: Fazil6 12.7.2007, 15:43
Цитата(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. Все, что в хедерах объявлено можно теперь использовать. Реализацию линкер будет брать из либы.

вот и все.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)