LINUX.ORG.RU

Разбиение проекта на C++ на подкаталоги


0

0

Добрый день!

Возникла задача разбить проект на C++ на подкаталоги в соответствии с его внутренней структурой. Пример:

main.cpp
globals.h
ui/
window.h
window.cpp

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

Например, и в файле main.cpp и в файле window.cpp файл globals.h должен включаться так:
#include "globals.h"

Аналогично и с файлом window.h - в файлах main.cpp и window.cpp нужно добавить:
#include "ui/window.h"

Внимание, вопрос: что такое нужно сказать GCC, чтобы он воспринял подобный код?


В упор не понял что вы хотите.

Особенно:

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

wfrr ★★☆
()

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

адекватное решение - переместить window.h в ui.

anonymous
()
Ответ на: комментарий от wfrr

Элементарно - хочу, чтобы путь к файлу, указанному в #include "" отсчитывался от корневого файла проекта, вне зависимости от того, где находится файл, содержащий эту директиву.

syomin
() автор топика
Ответ на: комментарий от anonymous

window.h и так в ui - читайте, пожалуйста, внимательнее...

syomin
() автор топика

Так, наверное, будет понятнее.

[syomin@localhost test]$ cat main.cpp
#include "globals.h"
#include "ui/window.h"

int main()
{
return 0;
}
[syomin@localhost test]$ cat globals.h
#ifndef GLOBALS_H
#define GLOBALS_H

#endif
[syomin@localhost test]$ cat ui/window.h
#ifndef WINDOW_H
#define WINDOW_H

#endif
[syomin@localhost test]$ cat ui/window.cpp
#include "globals.h"
#include "ui/window.h"

void foo() {}
[syomin@localhost test]$ c++ -c main.cpp -o main.o
[syomin@localhost test]$ c++ -c ui/window.cpp -o ui/window.o
ui/window.cpp:1:21: error: globals.h: No such file or directory
ui/window.cpp:2:23: error: ui/window.h: No such file or directory

Самое интересное, что судя по исходникам, разработчики Inkscape эту проблему победили, но уж очень не хочется разбираться, как Inkscape собирается...

syomin
() автор топика

main.cpp
globals.h
ui/window.h
ui/window.cpp


--- BEGIN --- main.cpp

#include "ui/window.h"
////
///
//

--- END --- main.cpp


gcc -I./ui main.cpp


irc_007_1
()
Ответ на: комментарий от ttnl


Dir/object.c
Dir/object.h
Dir/catalog/support.c
Dir/catalog/support.h


support.c компилируешь с ключом -I..
,тогда в нем можно использовать конструкции вида #include<object.h>

ttnl ★★★★★
()
Ответ на: комментарий от syomin

Накуя использовать #include "", когда можно сделать, как я написал.

Если очень хочется с кавычками "", то делай так:#include"../object.h"

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Элементарно - потому что #include "" удобно использовать для подключения файлов ИЗ ПРОЕКТА, а #include <> - СТОРОННИХ файлов. А ваш вариант мне известен, и он мне не нравится :)

syomin
() автор топика

В общем, отца русской демократии спас ключик -qoute. Вопрос закрыт.

syomin
() автор топика
Ответ на: комментарий от syomin

> Ключик -I влияет только на файлы, включаемые с помощью #include <>

4.2, читайте хоть изредка документацию перед тем как постить.

-iquote тут imho небольшой overhead, плюс она есть только в gcc 4. -I хватит выше крыши.

anonymous
()
Ответ на: комментарий от anonymous

В более старых GCC вместо -iquote есть ключик -I-.

syomin
() автор топика

>что такое нужно сказать GCC, чтобы он воспринял подобный код?

Если для вас трудно почитать ман гцц - то лучше доверить генерацию мейкфайлов утилитам типа premake, cmake, auto* ...
Они сгенерируют и пути и зависимости между проектами и тд.

stpg
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.