Как скомпилировать файлы С++, организованные в структуру каталогов?

Я написал кучу кода и отсортировал его примерно так:

project/
+ include/
| + bar/
| |   bar.hpp
|   foo.hpp
+ src/
| + bar/
| |   bar.cpp
|   foo.cpp
|   main.cpp

Мой вопрос в том, как мне теперь вызвать g++, чтобы он хорошо связал все вместе?

Я уже понял, что мне нужно вызвать его с опцией -I, указывающей на каталог include/. Я предполагаю, что имеет смысл вызывать g++ из проекта/папки. Кроме того, я рассматриваю возможность написания Makefile для автоматизации этого процесса, но я должен признать, что еще не провел много исследований по этому вопросу.


person robrene    schedule 22.01.2011    source источник
comment
как вы включаете, скажем, bar.hpp из bar.cpp?   -  person thbusch    schedule 22.01.2011
comment
@Sam: Пока я использую только g++, сейчас я читаю Makefiles (используя руководства GNU Make)   -  person robrene    schedule 22.01.2011
comment
@thbusch: я включаю bar.hpp из bar.cpp, используя #include "bar/bar.hpp". Я решил, что это должно работать, так как я сообщаю компилятору о каталоге include/.   -  person robrene    schedule 22.01.2011


Ответы (2)


Я бы рекомендовал использовать какой-нибудь инструмент сборки, например CMake или Автоинструменты. Создание ваших собственных Makefiles может быть своего рода PITA, чтобы сделать это правильно.

Если у вас есть небольшая структура каталогов с некоторыми файлами C++, которые вы хотите быстро скомпилировать, вы можете сделать что-то вроде этого:

find src/ -name "*.cpp" | xargs g++ -I include/
person mtvec    schedule 22.01.2011
comment
О, это очень похоже на что-то полезное! Однако я получаю много ошибок компоновщика с этим о нескольких определениях. Многие из моих заголовков имеют встроенные функции и включаются в несколько исходных файлов (прямо или косвенно). Как мне это решить? - person robrene; 22.01.2011
comment
@robrene В такой ситуации вы используете охрану. en.wikipedia.org/wiki/Include_guard - person Haozhun; 22.01.2011
comment
Хм, странно, это не может быть ошибкой, так как я использую include guards. У меня сложилось впечатление, что они защищают только для каждого файла cpp (то есть для каждого объекта), а не при связывании нескольких объектов вместе? Боюсь, это не то... - person robrene; 22.01.2011
comment
@robrene: это больше похоже на то, что вы забыли использовать ключевое слово inline. - person mtvec; 22.01.2011
comment
@Job: Это была проблема! Я думал, что компилятор автоматически встроит функцию, увидев, что она находится в заголовочном файле, я думаю, он автоматически встраивает только функции, определенные внутри области определения класса. Спасибо! - person robrene; 22.01.2011

Я думаю, что проще всего использовать IDE. Например, NetBeans создаст для вас файлы Makefile (другие IDE доступно).

person John Carter    schedule 22.01.2011