LINUX.ORG.RU

Язык C, C++: как подключать (#include) заголовки относительно корня проекта в GCC, кроссплатформенно?


0

1

Никак не могу понять простую вещь.

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

Насколько я выяснил, в Linux можно добавлять в переменную окружения INCLUDE_PATH путь к каталогу проекта. После чего будут работать директивы #include с файлами относительно корня проекта:

...препроцессор последовательно перебирает пути в INCLUDE_PATH начиная с первого. Относительный путь из директивы include разрешается относительно (sic) папки из INCLUDE_PATH. Если файл не найден, переходим к следующему элементу INCLUDE_PATH. Если INCLUDE_PATH исчерпан, компилятор сообщает об ошибке.

Однако возникают вопросы.

1. Какой путь добавлять к INCLUDE_PATH? Относительно корня файловой системы? Но тогда проект не будет собираться в другом каталоге, например, когда пользователь захочет самостоятельно скомпилировать проект, ведь у него не будет установлен нужный каталог в INCLUDE_PATH.

2. Где и как прописывать INCLUDE_PATH? Я поковырял исходники (Makefile) нескольких C/C++ опенсорчных проектов и не нашел никакой работы с INCLUDE_PATH. Значит, делают как-то по-другому, но как?

3. Проект кроссплатформенный. Необходимо понять, как и где настраивать INCLUDE_PATH (предположим, что используется система сборки make), чтобы компиляция шла и в Linux и в Windows под GCC.

4. Проект кроссплатформенный на Qt4. Необходимо понять, как и где настраивать INCLUDE_PATH, чтобы компиляция шла и в Linux и в Windows под GCC.

★★★★★

Относительно корня файловой системы?

Относительно корня исходников проекта.

crowbar ()

относительные пути - это неправильно

Относительные пути - это правильно в src, неправильно в tests и examples. Для tests и examples я добавляю относительный путь до папки src.

Где и как прописывать INCLUDE_PATH

прямо в вызове gcc -I{dir}

Необходимо понять, как и где настраивать INCLUDE_PATH, чтобы компиляция шла и в Linux и в Windows под GCC

это делают Find{Name}.cmake. когда проверяется конфигурация - в специальные переменные записываются нужные тебе пути до инклудов, библиотек, бинарников и тд.

punya ★★ ()
Последнее исправление: punya (всего исправлений: 2)

А что мешает это настроить в системе сборки? В cmake делается как-то так

include_directories(${CMAKE_SOURCE_DIR})

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

не CMAKE_SOURCE_DIR а PROJECT_SOURCE_DIR иначе проект нельзя будет подключить как субпроект.

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

Можно придумать еще 100500 локальных особенностей, именно поэтому я и написал «как-то так».

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

а зачем тебе cmake? у тебя же есть расово верный msbuild.

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

Комментарий «тупак» я тебе не зря написал. Вот к чему вообще этот твой комментарий? И да, представь себе я использую cmake и программирую под линукс!

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

Не вижу связи. У меня должность по трудовой, внезапно, _не_ программист.

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

я не только программированием занимаюсь, поэтому я прав, для программиста в чистом виде (описанного в документе по треду) высшее образование не нужно

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

программиста в чистом виде

ни один вуз не выпускает программистов в чистом виде. самое близкое инженер-программист. они тоже не только программированием занимаются.

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

Программистов готовят в ПТУ, а не в вузах.

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

вот это уже интересно. покажи где такое ПТУ есть.

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

Рядом с метро Измайловская есть «колледж информационных технологий», подозреваю, что это бывшее ПТУ :)

Для тех кто в танке: программист << инженер-программист. Это низшая ступень в IT, аналог уборщицы :) Да и вообще в этом треде это офтоп.

Reset ★★★★★ ()
Последнее исправление: Reset (всего исправлений: 1)
Ответ на: комментарий от Reset

ну незнаю. у нас в беларуси такого нету. самая низшая инстанция, готовящая людей связанных с IT - БГУИР. это университет такой. вы там в россии совсем уже. сначала испоганили слово «хакер» щас за «программиста» взялись. =(

punya ★★ ()

В общем, меня интересовал больше вопрос по Qt, как в нем устанавливать INCLUDE_PATH, причем делать это кроссплатформенно.

Ответ: начиная с версии Qt 4.5, в *.pro файле можно использовать переменную $${_PRO_FILE_PWD_}, которая содержит путь до *.pro файла.

То есть, если сырцы лежат в поддиректории src относительно *.pro файла:

..  [DIR]
src [DIR]
myprogram.pro 

то путь INCLUDE_PATH можно задать так:

INCLUDEPATH += $${_PRO_FILE_PWD_}/src

Эту строку надо прописывать в *.pro файле, в нашем случае в myprogram.pro.

Xintrea ★★★★★ ()
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от punya

вот это уже интересно. покажи где такое ПТУ есть.

В моем городе есть. Бывшее ПТУ-105, теперь «Профессионально-технический лицей №105».

Дипломные работы по программированию, которые там делают и которые я видел, реально на голову выше тех высеров, на которые я насмотрелся в своем вузе на кафедрах микроэлектроники и информационных систем.

Там реально готовят практиков, дипломные работы приемная комиссия проверяет прямо на компьютерах «в работе». В номинации «малая автоматизация производственной деятельности» дипломные работы действительно сильные. Они, конечно, примитивные, решают какую-то одну узкую проблему (обычно какой-нибудь учет), используют бредовые фреймверки типа Delphi и Visual Fox Pro. Но.

1. Дипломные работы реально работают как программы, они хотя бы запускаются.
2. Объем кода примерно 1Мб (~25 файлов x 30-40 Кб), что для ПТУ ящитаю очень даже замечательно.

Xintrea ★★★★★ ()

Если qt, то в файле .pro вашего проекта просто прописать директиву

INCLUDEPATH += .
и все, любые инклуды можно задавать от корня проекта (разумеется если считать что файл pro лежит в корне проекта)

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