Как разобраться в связях / зависимостях C ++? - PullRequest
5 голосов
/ 14 августа 2010

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

Всякий раз, когда мне нужно написать код на C ++, все усложняется.Я могу думать о создании файлов * .h как интерфейсов в Java, но понимание того, как написать файл сборки и какие классы заказов должны быть включены, вызывает у меня головную боль.

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

Существует ли какая-либо структура, позволяющая сделать создание файлов BUILD или управление всеми этими шаблонными материалами компиляции более приемлемыми

Ответы [ 2 ]

8 голосов
/ 14 августа 2010

CMake - лучшая система сборки, которую мне удалось найти до сих пор.Вы даете ему список ваших исходных файлов, и он автоматически сканирует зависимости и перекомпилирует только измененные файлы.Хотя его синтаксис немного забавен, а документация не очень доступна, CMake превосходит GNU autotools по удобству и простоте использования и работает на всех основных платформах.

Что касается вашей "ментальной модели" происходящего,Вот некоторые моменты, о которых следует помнить.

  • Файл .cpp компилируется полностью независимо от других файлов .cpp.

  • .cpp файл читается компилятором сверху вниз, только один раз.Следовательно, все должно быть в правильном порядке.

  • Директива #include аналогична копированию / вставке заголовка в файл .cpp.

  • В точке, где используется функция, требуется объявление этой функции, но не обязательно определение .

  • В точке доступа к члену класса необходимо определение класса.Вывод из класса также требует его определения.Получение указателей или ссылок не требует определения, но требует декларации .Используйте это в своих интересах в заголовках: вместо включения Foo.hpp, посмотрите, сможете ли вы обойтись без простого объявления class Foo;.

  • При компиляции файла .cpp,генерируется файл .o, который содержит реализацию именно тех функций , определенных в .cpp.Ссылки на функции, не определенные в нем, остаются для разрешения компоновщику.

  • Компоновщик объединяет все эти определения в исполняемый файл, но каждое определение функции должно присутствовать ровно один раз.(Шаблоны и встроенные функции являются исключением.)

1 голос
/ 14 августа 2010

Я большой поклонник подкаста stackoverflow, и я решил, что когда я буду использовать систему сборки, я должен использовать FinalBuilder.

Джефф Этвуд и Джоэл Спольски говорили об этом, и упоминается, что он используется в Фог-Крик.

Подкаст здесь

FinalBuilder здесь

Художественный тур

Надеюсь, он подходит для этой цели.

Работает на платформе Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...