使用 gcc 编译对用户来说很糟糕,但对 root 来说很好

使用 gcc 编译对用户来说很糟糕,但对 root 来说很好

因此,在以普通用户身份进行编译的过程中,我的服务器已停止工作。我使用的是 Debian 稳定版。无法想象我的系统发生了什么变化会导致这种情况,或者如何修复它,但现在只有 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 。 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 使这些事情变得更加容易。最终你会想学习如何做到这一点。

您可能会遇到一些其他问题,这些问题与重复此标头的原因无关,但您必须对此进行解释。这是你的系统吗?

答案2

我尝试过修复烫发,但无法解决。有没有一种方法可以忽略 /usr/local 中的 cdefs.h 并使用 /usr/include/ 中的 cdefs.h ?

是的,不要将它们安装在/usr/local/. Debian 永远不会在 中安装任何东西/usr/local,所以如果这里有文件,那是因为你、其他本地管理员或打包不当的软件在这里安装了这些东西。将它们安装在其他地方。但是在 /usr/local 中安装另一个 libc 的头文件会带来麻烦。

相关内容