2012-01-08 1 views
6

У меня есть следующее direcory stucture:включение файлов заголовков - относительно текущего каталога или включения каталогов?

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 

Оба lib1 и lib2 собираются быть распределены (установлено). lib2 использует lib1, поэтому она нуждается в некоторых включает в себя:

#include "../lib1/lib1.h" // 1 
#include "lib1/lib1.h" // 2 
#include <lib1/lib1.h> // 3 

(1) является прямым путем, но очень unflexible. (2) - это способ, которым я пользуюсь в настоящий момент, но система сборки должна знать, что src необходимо добавить в путь включения. (3) кажется лучшим для меня при распределении , потому что тогда можно предположить, что заголовки находятся в стандартном местоположении, но для меня не слишком очевидно, как система сборки обрабатывает это (в этом случае lib1 необходимо должен быть установлен до lib2 может быть скомпилирован).

Каков рекомендуемый способ?

+0

Что вы подразумеваете под «установкой» lib? Является ли это статической или динамической библиотекой? Если он статичен, просто создайте красивую структуру депо и добавьте эти папки в свой путь include. –

+0

Это все специфическое исполнение. В некоторых системах даже нет каталогов! –

+0

@EdS., Я имею в виду: файлы заголовков и библиотеки копируются где-то (стандартное расположение, '/ usr/local/{lib, include}'), так что их можно использовать в других проектах. –

ответ

9

Единственное различие между "" и <> формами включают в себя в том, что "" форме первого поиск в некоторых местах, а затем возврат к тем же местам, как <>. Набор дополнительных мест зависит от реализации, и единственным распространенным является каталог файла, содержащего директиву include. Параметры компилятора, которые добавляют к пути включения, обычно добавляют для формы <>, и поэтому эти каталоги ищут обе формы.

Таким образом, выбор между двумя формами в основном является стилем. Использование формы "" для текущего проекта и <> для системных библиотек является общим. Для вещей между ними, сделал выбор и придерживаться его в вашем проекте.

+0

С точки зрения 'lib2': нет никакой разницы между' lib1/lib1.h' и, например. 'boost/shared_ptr.hpp', за исключением того, что они написаны одним и тем же программистом и находятся в родственных книгах (потому что они« в основном работают вместе », но могут также использоваться независимо другими коллегами). Но в моем случае я бы использовал первый с '' "', а другой с '<>'. +1 для указания, что включенные пути всегда используются как резерв, и проблема более эстетична. –

2

я голосовать за версии 2.

#include "../lib1/lib1.h" // 1 

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

#include "lib1/lib1.h" // 2 

Я не вижу, что проблема добавления src в путь включения. На самом деле, вам не нужно даже добавить SRC на пути включения, вы можете сразу добавить Src/lib1 и просто #include "lib1.h"

#include <lib1/lib1.h> // 3 

Этот стиль включает в себя используется для системных заголовков. Вам следует избегать этого, поскольку большинство программистов используются для просмотра windows.h или string или vector внутри <>. Вы также говорите компилятору, чтобы сначала искать те заголовки в каталогах по умолчанию, а не свои собственные. Я бы избегал этого.

Примечание стороны:

Вы должны думать о структуре, как это:

src 
    +-- lib1 
    +-- lib1.h 
    +-- lib2 
    +-- lib2.h 
include 

где каталог include содержит все публично видимые заголовки. Если lib1.h является общедоступным, переместите его туда. Если нет, структура, которую вы сейчас используете, должна быть в порядке.

+0

Почему downvote? –

+0

Я думаю, что вы ошибаетесь в '#include" lib1.h ", как я уже сказал, обе библиотеки должны быть установлены и использоваться другими проектами. Поэтому включение 'lib1/lib1.h' вместо просто' lib1.h' имеет то преимущество, что его можно использовать в других проектах без указания других включенных путей, чем по умолчанию. Но это был не мой downvote, btw :) –