gcc로 컴파일하는 것은 사용자에게는 짜증나지만 루트에게는 괜찮습니다.

gcc로 컴파일하는 것은 사용자에게는 짜증나지만 루트에게는 괜찮습니다.

그래서 일반 사용자로 컴파일하는 동안 내 서버가 작동을 멈췄습니다. 데비안 안정 버전을 사용하고 있습니다. 내 시스템에서 무엇이 변경되어 이 문제가 발생했는지, 어떻게 해결해야 할지 상상할 수 없지만 이제 루트만 컴파일할 수 있습니다.

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

완전히 무시할 수 있는 특별히 좋은 방법은 없다고 생각합니다(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

아마도 이는 로컬 사용자로 시스템을 쉽게 재정의할 수 있도록 하기 위한 것입니다. 그러나 이들 모두보다 우선하는 것은 -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/. 데비안은 에 아무것도 설치하지 않으므로 /usr/local여기에 파일이 있는 경우 이는 귀하, 다른 로컬 관리자 또는 잘못 패키지된 소프트웨어가 이 항목을 여기에 설치했기 때문입니다. 다른 곳에 설치하십시오. 그러나 /usr/local에 다른 libc 헤더 파일을 설치하면 문제가 발생합니다.

관련 정보