| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 ) |
| Автор: Daevaorn 11.7.2007, 15:26 |
системы писать научились, а раздел форума правильно выбирать - нет. жаль. |
| Автор: 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 |
| Спасибо всем, всё заработало. Только вот по поводу зависимоти проектов: транзитивность у меня пока не наблюдается. Общий вид зависимостей таков: (--> зависимость ) TestSuite--->ProjectA --->ProjectB MyTestSuite-->TestSuite -->ProjectA -->ProjectB Только при такой конфигурации работает. Если делаю так: MyTestSuite-->TestSuite, в надежде на присутствие транзитивности, то вылазиет куча ошибок |
| Автор: Fazil6 11.7.2007, 19:14 | ||
что работает? Чего ты хочешь добиться?
каких ошибок? Твои проекты в одном солюшене? |
| Автор: 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 | ||
У меня вот такая ситуация: 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 | ||
ну так в этом и есть смысл 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. Все, что в хедерах объявлено можно теперь использовать. Реализацию линкер будет брать из либы. вот и все. |