Здание "Монолитных" библиотек - PullRequest
1 голос
/ 29 апреля 2011

У меня есть серия небольших библиотечных «модулей», предназначенных для решения очень специфических задач.Один модуль обычно состоит только из .h и .cpp и, возможно, другого набора для предоставления соответствующих функций, не являющихся друзьями, не являющимися членами, которые пользователь может найти полезными.

Например, Foo.h может объявить класс с именем Foo, который определяет Foo.cpp, а FooUtilities.h может объявить функцию, которая использует Foo, которая определяется FooUtilities.cpp.

Обычно для использования этих модулей в моемпрограммы, я добавляю .h и .cpp в свой проект и #include .h в любых нужных файлах.Однако для более крупных программ, которые используют больше потенциально взаимозависимых модулей, это становится большим неудобством.Поэтому я хотел бы скомпилировать все это как одну монолитную статическую или динамическую библиотеку, чтобы я мог просто добавить файл библиотеки в свой проект, установить каталоги поиска заголовков для папок, содержащих вышеупомянутые .h файлы, и выполнить компиляцию.

Кажется довольно просто, верно?Все, что мне нужно сделать, это начать новый проект со статической / динамической библиотекой в ​​качестве цели сборки, а затем добавить все соответствующие файлы.Файлы .cpp, которые в любом случае #include файлы .h, будут скомпилированы и добавлены в конечный продукт.

Однако некоторые модули используют шаблоны и поэтому вместо них должны использовать .tpp.cpp.Файлы .tpp предназначены только для организации и имеют #include d в соответствующих заголовочных файлах, что противоположно тому, как обрабатываются обычные модули.Из-за этого просто добавив их в мой библиотечный проект, ничего не скомпилируется.

Как я могу обойти это?Должен ли я иметь файл CompileThis.cpp, который включает все модули, использующие шаблоны?Если так, должен ли этот файл также включать не шаблонные модули?Похоже, это может быстро превратиться в организационный беспорядок.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Многие компиляторы не могут «предварительно скомпилировать» шаблоны в библиотеки.Мое лучшее предложение - обращаться с ними как с заголовочными файлами;Заголовочные файлы не компилируются в библиотеки, они просто включены.

Я компилирую код в библиотеку, когда количество изменений минимально.Это часто ускоряет процесс сборки, поскольку эти файлы не нужно снова компилировать (и снова ...).

1 голос
/ 29 апреля 2011

Должен ли я иметь файл CompileThis.cpp, который включает все модули, использующие шаблоны?

Да - вам все еще понадобится объект для связи.Это также хорошо, потому что он будет выполнять проверки синтаксиса / создания экземпляров (при условии, что ваши зависимости правильно упорядочены).

Если это так, должен ли этот файл также включать не шаблонные модули?

, который зависит от структуры.

  • как минимум, должен включать / определять, что он должен экспортировать (и их зависимости).

  • он должен часто включать заголовки, представленные модулем, чтобы легко обнаруживать ошибки на уровне пакета.

  • в идеале вы добавите все необходимые концепции и некоторые экземпляры (вв некоторых случаях).

это облегчает обслуживание и не потребует серьезной реструктуризации, когда вы осознаете, что перешли от необходимости экспортировать 0 символов к одному или нескольким.

...