![]() |
|
|
![]()
|
|
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 ) |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 3 Всего: 60 |
да, вернее не должен , а будет зависеть, т.е . при компилляции А будет компилироваться С, потом В и потом А, но явно указывать в настройках , что A зависит от С не нужно
выделить реализацию в статическую библиотеку и подключать ее вместе с хедерами во все необходимые проекты Это сообщение отредактировал(а) Fazil6 - 11.7.2007, 15:27 |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 Но это от ошибки не избавляет |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
В свойствай проекта -> C/C++ -> Precompiled headers убери их
|
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Спасибо всем, всё заработало.
Только вот по поводу зависимоти проектов: транзитивность у меня пока не наблюдается. Общий вид зависимостей таков: (--> зависимость ) TestSuite--->ProjectA --->ProjectB MyTestSuite-->TestSuite -->ProjectA -->ProjectB Только при такой конфигурации работает. Если делаю так: MyTestSuite-->TestSuite, в надежде на присутствие транзитивности, то вылазиет куча ошибок |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 3 Всего: 60 |
||||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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, только галки проставляй |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
У меня вот такая ситуация: 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 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 3 Всего: 60 |
ну так в этом и есть смысл 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. Все, что в хедерах объявлено можно теперь использовать. Реализацию линкер будет брать из либы. вот и все. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |