gccでコンパイルするのはユーザーにとっては迷惑ですが、rootには問題ありません。

gccでコンパイルするのはユーザーにとっては迷惑ですが、rootには問題ありません。

だから私は通常のユーザーとしてコンパイル中に私のサーバーが動作を停止しました。 Debian 安定版を使用しています。私のシステムで何が変更され、この問題が発生したのか、それを解決する方法を想像することはできませんが、ルートのみをコンパイルできます。

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.

ルートにコンパイルするだけです。これが権限の問題だと思いますか?

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 はユーザーが読むことができます。 Rootは、/usr/local/include/sysに対する権限が次のようになることを示しています(ユーザーがStaffグループにあることに注意してください)。

drwxr-Sr-- 2 ルートスタッフ 4096 12月7日 08:20 システム

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

パーマを修正しようとしましたが修正できません。 /usr/localのcdefs.hを無視して/usr/include/のcdefs.hを使用する方法はありますか?

どんな助けでも大変感謝します!

ベストアンサー1

完全に無視できる特別な方法はないと思います(gccnostdincスイッチを使用できますが、必要なすべてのパスに-Iを追加する必要があります)。

しかし、コンパイラに必要なものを選択させる簡単な方法があります。 ~によるとhttp://gcc.gnu.org/onlinedocs/cpp/Search-Path.html、パスを含む一般的な順序は次のとおりです。

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

おそらく、これはローカルユーザーとしてシステムを簡単にオーバーライドできるようにすることです。しかし、これらすべてを優先するのは-Iなので、コンパイルすると次のようになります。

gcc -I/usr/include/sys

これで選択されます。cdfs.hそこから。パスから/usr/local/includeを削除しないため、このカテゴリに属する​​他のファイルがある場合は、より多くの-Iが必要になる場合があります。再帰的ではありません。たとえば、次のようになります。

gcc -I/usr/include

/usr/include/sys は、他のバージョンが /usr/include の優先順位を指定しないように、優先順位を付けません。したがって、次のものが必要な場合があります。

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

ちなみに、makefileを使用すると、これらの操作がはるかに簡単になります。結局のところ、これを行う方法を学びたいと思います。

このヘッダーが繰り返される理由とは関係のない他の問題が発生する可能性がありますが、これについて説明する必要があります。これはあなたのシステムですか?

おすすめ記事