g ++, похоже, не может найти файл .h с ключом командной строки -I [duplicate]

В MySQL есть два типа кавычек:

  1. ' для включения строковых литералов
  2. ` для включения идентификаторов, таких как имена таблиц и столбцов

И тогда есть ", который является частным случаем. Он может быть использован для one вышеупомянутых целей за раз в зависимости от сервера MySQL sql_mode :

  1. By по умолчанию символ " может использоваться для вложения строковых литералов точно так же, как '
  2. В режиме ANSI_QUOTES символ " может использоваться для заключите идентификаторы так же, как `

Следующий запрос приведет к различным результатам (или ошибкам) ​​в зависимости от режима SQL:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES disabled

Запрос будет выбирать строковый литерал "column", где column foo равен строке "bar"

ANSI_QUOTES enabled

В запросе будет выбран столбец column где столбец foo равен столбцу bar

. Когда использовать

  • , я предлагаю вам избегать использования ", чтобы ваш код не зависел от SQL mode
  • Всегда указывайте идентификаторы, так как это хорошая практика (довольно много вопросов о SO обсуждают это)

13
задан Tshepang 26 April 2014 в 08:22
поделиться

3 ответа

Для gcc это опция -I для заголовка включает . Для файлов .cpp вам просто нужны те, которые отображаются как аргумент команды gcc.

3
ответ дан Andrew White 26 August 2018 в 05:23
поделиться

Чтение Fine Manual

Это доступно всем для чтения. У вас даже есть выбор того, что использовать (я бы пошел первым):

-Idir

Добавить каталог dir в начало списка каталогов, которые будут искать файлы заголовков , Это можно использовать для переопределения файла заголовка системы, подставляя вашу собственную версию, поскольку эти каталоги просматриваются перед каталогами заголовков системных заголовков. Однако вы не должны использовать эту опцию для добавления каталогов, содержащих файлы заголовков систем поставщика (для этого используйте -isystem). Если вы используете более одного параметра -I, каталоги сканируются в порядке слева направо; следующие стандартные каталоги системы.

Если стандартная система включает каталог или каталог, указанный в -isystem, также указан с -I, опция -I игнорируется. Каталог по-прежнему выполняется, но в качестве системного каталога в его нормальном положении в системе есть цепочка. Это делается для того, чтобы исключить непреднамеренное изменение процедуры GCC для исправления багги системных заголовков и упорядочения для директивы include_next. Если вам действительно нужно изменить порядок поиска для системных каталогов, используйте опции -nostdinc и / или -isystem.

-iquotedir

Добавьте директорию каталога в начало списка каталогов для поиска файлов заголовков только для случая #include "file"; они не ищут #include <file>, иначе как -I.

11
ответ дан rubenvb 26 August 2018 в 05:23
поделиться

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

В частности, вы хотите

g++ -I/root/workingdirectory -I/root/workingdirectory2

Обратите внимание также на документацию по синтаксису директив #include, описанную здесь здесь как:

2.1 Включить синтаксис

Оба файла заголовка пользователя и системы включены с помощью директивы предварительной обработки #include. Он имеет два варианта:

#include <file>

Этот вариант используется для файлов системных заголовков. Он ищет файл с именем file в стандартном списке системных каталогов. Вы можете добавить каталоги в этот список с опцией -I (см. Invocation).

#include "file"

Этот вариант используется для файлов заголовков вашей собственной программы. Он ищет файл с именем file сначала в каталоге, содержащем текущий файл, затем в каталогах цитат, а затем в тех же каталогах, что и для <file>. Вы можете добавить каталоги в список каталогов котировок с опцией -iquote. Аргумент #include, ограниченный кавычками или угловыми скобками, ведет себя как строковая константа в том, что комментарии не распознаются, а имена макросов не расширены. Таким образом, #include <x/*y> указывает включение системного заголовочного файла с именем x / * y.

Однако, если обратные слэши происходят внутри файла, они считаются обычными текстовыми символами, а не escape-символами. Обработаны ни одна из управляющих последовательностей символов, соответствующих строковым константам в C. Таким образом, #include "x\n\\y" указывает имя файла, содержащего три обратной косой черты. (Некоторые системы интерпретируют \ как разделитель пути. Все это также интерпретирует / одинаково. Наиболее переносимо использовать только /.)

Это ошибка, если есть (кроме комментариев) в строке после имени файла.

Так, например,

#include "first.h"

запустит , глядя в тот же каталог, что и файл .cpp, содержащий эту директиву (или относительный путь относительно этого каталога).

Если вы хотите использовать путь include (указанный в -I), вы должны использовать

#include <dir1/third.h>

Обычная практика заключается в использовании формы #include "local.h" для заголовков внутри библиотеки / пакета / модуля (однако вы решили организовать это), а форма #include <external.h> для заголовков из внешние / сторонние или системные библиотеки.

7
ответ дан Useless 26 August 2018 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: