компиляция с gcc для пользователей, но отлично подходит для root

Поэтому где-то по пути компиляция как обычного пользователя перестала работать на моем сервере. Я на Debian Stable. Не могу подумать о том, что изменилось в моей системе, что приведет к этому, или как его исправить, но теперь может компилироваться только root.

user@box:~/code/helloworld$ gcc helloworld.c -o helloworld In file included from /usr/include/stdio.h:28:0, from helloworld.c:3: /usr/include/features.h:356:25: fatal error: /usr/local/include/sys/cdefs.h: Permission denied compilation terminated. 

Компиляция с правами root – это хорошо. Я предполагаю, что это вопрос с разрешениями?

 As user@server: ls -la /usr/local/include/sys/cdefs.h ls: cannot access /usr/local/include/sys/cdefs.h: Permission denied ls -la /usr/local/include/sys/ ls: cannot access /usr/local/include/sys/.: Permission denied ls: cannot access /usr/local/include/sys/..: Permission denied ls: cannot access /usr/local/include/sys/apparmor.h: Permission denied ls: cannot access /usr/local/include/sys/cdefs.h: Permission denied total 0 d????????? ? ? ? ? ? . d????????? ? ? ? ? ? .. -????????? ? ? ? ? ? apparmor.h -????????? ? ? ? ? ? cdefs.h 

Пользователь может читать / usr / local / include fine. Root показывает perms в / usr / local / include / sys (обратите внимание, что пользователь находится в группе персонала):

drwxr-Sr– 2 корневой персонал 4096 дек. 7 08:20 sys

Расположение cdefs.h

 locate cdefs.h /usr/include/ldap_cdefs.h /usr/include/i386-linux-gnu/sys/cdefs.h /usr/include/sys/cdefs.h /usr/local/include/sys/cdefs.h 

Я пробовал исправлять пермы, но я не могу понять это правильно. Есть ли способ игнорировать cdefs.h из / usr / local и использовать тот, который он / usr / include /?

Любая помощь очень ценится!

Я не думаю, что есть особенно хороший способ полностью игнорировать его (это возможно с nostdinc переключателя gcc nostdinc , но тогда вам нужно будет добавить -I для всех необходимых путей).

Однако есть простой способ заставить компилятор выбрать тот, который вы хотите. Согласно http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html , нормальный порядок включенных путей:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

Предположительно, это позволит вам легко переопределить систему с помощью локального пользователя. Но какие козыри все это – я, поэтому, если вы скомпилируете:

 gcc -I/usr/include/sys 

Затем он выберет cdefs.h оттуда. Он не будет исключать / usr / local / include из пути tho, поэтому, если есть другие файлы, которые попадают в эту категорию, вам может понадобиться больше. Они не являются рекурсивными, поэтому, например:

 gcc -I/usr/include 

Не будет приоритизировать / usr / include / sys, так же как другая версия не будет приоритизировать / usr / include. Таким образом, вам может потребоваться:

 gcc -I/usr/include -I/usr/include/sys 

Использование make-файла делает эти вещи значительно проще, кстати. В конце концов вам захочется узнать, как это сделать.

Могут быть некоторые другие проблемы, с которыми вы столкнетесь, связанные с тем, что причина для дублирования этого заголовка, но вам придется это объяснить. Это ваша система?

Я пробовал исправлять пермы, но я не могу понять это правильно. Есть ли способ игнорировать cdefs.h из / usr / local и использовать тот, который он / usr / include /?

Да, не устанавливайте их в /usr/local/ . Debian никогда не будет устанавливать что-либо в /usr/local , поэтому, если здесь есть файлы, это потому, что вы, другие локальные администраторы или плохо упакованное программное обеспечение, установили эти вещи здесь. Установите их в другом месте. Но установка других заголовков libc в / usr / local вызывает проблемы.