2014-11-24 4 views
2

Я на Arch Linux. Я пробовал gcc и cc.Изменения во включенном файле, не зарегистрированные в C

У меня довольно странная проблема. У меня есть файл, включенный из/usr/include (установленный из пакета Arch) в такой программе C.

// prog.c 
#include <foobar/foobar.h> 

Когда я меняю его, ничего не происходит. Позволь мне объяснить. Он включает в себя некоторый код С.

// foobar/foobar.h 
int baz = 1, qux = 2; 

В последнее время он был обновлен.

// foobar/foobar.h 
int baz = 1, qux = 2, norf = 3; 

Моя тестовая программа выглядит примерно так, как следует.

// prog.c 
#include <foobar/foobar.h> 
printf ("%d %d %d\n", baz, qux, norf); 

выход:

error: ‘norf’ undeclared (first use in this function) 

я могу дублировать файл в том же каталоге, имя его foobar2.h, а затем включить этот файл, а и выводит:

1 2 3 

Так путь неверен. Я могу сделать ссылку на папку, назовите его foobar2, и включает в себя foobar2/foobar.h и выводит:

1 2 3 

Так что файл не является неправильным.

Чтобы подтвердить, что он не регистрирует изменения, я могу полностью удалить папку foobar и попытаться напечатать только две переменные, которые изначально были внутри заголовка. Эти выходы:

1 2 

Очевидно, что-то не обновляется. Такое же поведение отображается, когда я пытаюсь обновить файл с перечислениями, функциями или новыми значениями для существующих элементов в файле и включить их в качестве единственных строк в файле. Ни одно из изменений не регистрируется. То же самое действие отображается с помощью gcc и cc. Это происходит уже несколько месяцев, и оно все еще не разрешилось.

+0

Если вы считаете, что это имеет какое-то отношение к самой библиотеке, у меня есть некоторые подробности здесь: http://pastebin.com/Mhj4jfFr – rbong

+1

Я бы попытался включить этот файл, используя кавычки. Возможно, ваша библиотека системных кэшей включает в себя более быструю компиляцию. – Anonymous

+1

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

ответ

2

Когда файл, похоже, не обновляется, рекомендуется проверить другие места в вашей системе, где ваши компиляторы ищут библиотеки для одинаково названных папок. В этом случае это было в/usr/local/include, где у меня была версия, которую я собрал и полностью забыл.

+0

Новичок здесь - есть ли порядок приоритета с путями поиска по умолчанию в системе? Была ли старшая версия в папке, которая сначала искалась? –

+1

В соответствии с разделом 3.19 руководства gcc включить пути, заданные параметрами -B, -I, -L и другими параметрами командной строки, имеют приоритет над путями включения, указанными с использованием переменных среды, которые имеют приоритет над включаемыми путями, заданными конфигурацией gcc. В разделе «Введение в раздел GCC_ 3.1» говорится, что порядок поиска заголовков:/usr/local/include, затем/usr/include, а порядок для библиотек -/usr/local/lib, затем/usr/lib. – rbong

0

Это может быть вызвано главным образом несоответствием пути каталога. Проверьте переменную окружения, которая может повлиять на поведение, например C_INCLUDE_PATH, CPATH. Другой вариант - проверить с помощью gcc -I/src/directory foobar.h компиляцию, которая может привести вас ближе к проблеме или использовать код #include "foobar.h".

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

Смежные вопросы