Компилятор G CC не ищет подкаталоги при поиске файлов заголовков - PullRequest
0 голосов
/ 23 апреля 2020

Я не могу заставить g cc компилятор распознавать сложные пути в "include".

Вот мой игрушечный файл "main. cpp" (обратите внимание на подкаталог в операторе include):

#include "sub/testlib.h"

int main()
{
    testlib(6);
    return 0;
}

Вот путь к файлу "testlib.h" из папка "main. cpp" находится в: ../lib/sub/testlib.h.

Я указываю каталог include при компиляции:

gcc -c -iquote../lib main.cpp

И компилятор кричит на меня:

main.cpp:1:10: fatal error: sub/testlib.h: No such file or directory
    1 | #include "sub/testlib.h"
      |          ^~~~~~~~~~~~~~~
compilation terminated.

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

Как заставить g cc хорошо обрабатывать подкаталоги во включениях? Здесь есть флаг или какой-то вариант, который мне не хватает?

1 Ответ

1 голос
/ 23 апреля 2020

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

Прочитайте документацию G CC, в частности Invoking G CC глава, раздел опции препроцессора (например, -I include-dir или -H или -M, et c .. .), документация препроцессора . Попробуйте также g++ --help; флаг -I include-directory может повторяться много раз и, вероятно, это то, что вам нужно. Конечно, порядок аргументов в программе g++ имеет большое значение. Возможно, вы захотите использовать g++, а не gcc при компиляции или компоновке программ на C ++.

Читайте также некоторую документацию на C ++ (возможно, даже черновик n3337" "стандарт). Помните о единицах перевода и о роли компоновщика .

На практике вы хотите запустить компиляцию G CC с использованием некоторой сборки инструмент автоматизации , такой как GNU make или ninja или многие другие.

Если вы используете GNU make, прочтите документацию затем попробуйте make -p, который показывает множество встроенных правил, известных этому программному обеспечению. Помните о многих функциях из make.

Если вы используете ninja, прочитайте документацию , вы, вероятно, захотите генерировать скрипт build.ninja, который он использует. Вы можете сгенерировать его, используя Python скрипт или Guile один (или вашу собственную программу на C ++, et c ...).

Будьте в курсе это, конечно, g++ вызовет некоторые утилиты GNU binutils (например, ассемблер as или компоновщик ld).

На практике, вызывайте g++ как g++ -Wall -Wextra -g для получения предупреждений и отладочной информации (конечно, с дополнительными -I include-directory flags). Затем используйте отладчик gdb . Если в вашей программе есть несколько ошибок, добавьте флаги оптимизации, такие как -O2

См. Также Clang , stati c анализатор , Frama- C и CompCert и, в конце 2020 года, Bismon .

В некоторых случаях рекомендуется создать код #include -d C ++ ( например, с помощью SWIG или ANTLR или Qt или вашего собственного сценария) или для расширения G CC с помощью ваших плагинов .

Знайте, конечно, Джоэл Тест .

...