Структура каталогов для библиотеки C++
Я работаю над библиотекой C++. В конечном счете, я хотел бы сделать его общедоступным для нескольких платформ (Linux и Windows, по крайней мере), наряду с некоторыми примерами и Python привязки. Работа идет хорошо, но на данный момент проект довольно грязный, построен исключительно в и для Visual C++ и не мультиплатформенный вообще.
поэтому я чувствую, что очистка в порядке. Первое, что я хотел бы улучшить, это каталог проекта структура. Я хотел бы создать структуру, которая подходит для Automake инструменты для легкой компиляции на нескольких платформах, но я никогда не использовал их раньше. Поскольку я все еще буду делать (большую часть) кодирования в Visual Studio, мне нужно будет где-то хранить мой проект Visual Studio и файлы решений.
Я попытался google для терминов, таких как" структура каталогов библиотеки C++", но ничего полезного, похоже, не придумал. Я нашел некоторые очень основные рекомендации, но нет кристально чистые решения.
глядя на некоторые библиотеки с открытым исходным кодом, я придумал следующее:
mylib
mylib <source files, read somewhere to avoid 'src' directory>
include? or just mix .cpp and .h
bin <compiled examples, where to put the sources?>
python <Python bindings stuff>
lib <compiled library>
projects <VC++ project files, .sln goes in project root?>
include?
README
AUTHORS
...
У меня нет/мало опыта работы с мультиплатформенными проектами/проектами с открытым исходным кодом, и я очень удивлен, что не могу найти хороших рекомендаций о том, как структурировать такой проект.
как обычно структурировать такой проект библиотеки? Что ca рекомендуется читать? Есть ли хорошие примеры?
3 ответов
одна вещь, которая очень распространена среди библиотек Unix, заключается в том, что они организованы так, что:
./ Makefile and configure scripts.
./src General sources
./include Header files that expose the public interface and are to be installed
./lib Library build directory
./bin Tools build directory
./tools Tools sources
./test Test suites that should be run during a `make test`
это несколько отражает традиционную файловую систему Unix под /usr
где:
/usr/src Sometimes contains sources for installed programs
/usr/include Default include directory
/usr/lib Standard library install path
/usr/share/projectname Contains files specific to the project.
конечно, они могут оказаться в /usr/local
(который является префиксом установки по умолчанию для GNU autoconf), и они могут вообще не придерживаться этой структуры.
нет жесткого и быстрого правила. Лично я так не организовываю. (Я избегаю использования ./src/
каталог вообще, за исключением крупнейших проектов, например. Я также не использую autotools, предпочитая вместо CMake.)
мое предложение к вам заключается в том, что вы должны выбрать макет каталога, который смысла (и ваша команда). Делайте все, что наиболее разумно для выбранной среды разработки, инструментов сборки и управления версиями.
Я не думаю, что на самом деле есть хорошие рекомендации для этого. В основном это просто личные предпочтения. Однако некоторые IDE определят для вас базовую структуру. Например, Visual Studio создаст отдельную папку bin, разделенную на вложенные папки Debug и Release. В VS это имеет смысл, когда вы компилируете свой код, используя разные цели. (Режим отладки, режим выпуска.)
Как говорит greyfade, используйте макет, который имеет смысл для вас. Если кто-то еще не как это, они просто должны будут реструктурировать его сами. К счастью, большинство пользователей будут довольны выбранной вами структурой. (Если только это не очень грязно.)
Я считаю, что библиотека wxWidgets (с открытым исходным кодом) является хорошим примером. Они поддерживают множество различных платформ (Win32, Mac OS X, Linux, FreeBSD, Solaris, WinCE...) и компиляторы (индекса MSVC, на GCC, CodeWarrior, Watcom В и др.). Вы можете увидеть макет дерева здесь: