여러 source code 를 빌드하다보면 library link 가 깨지는 현상이 발생함. 또한 library 를 sudo apt install
혹은 sudo dpkg
로 install 하거나 source code 로 빌드했을 경우. 빌드 이후에 설치되는 directory 가 변경되어 버전 관리에 많은 어려움이 발생함. 본 포스팅은 library 및 include file 빌드에 많이 사용되는 /usr
그리고 /usr/local
의 차이점에 대해 기술했음.
/usr/local
and /usr
위 directory 는 둘 다 linux 같은 unix-like system에서 사용하는 top-level directory 임.
먼저 /usr
과 /usr/local
은 거의 동일한 구조를 가지고 있음.
ls /usr
bin games include lib lib32 lib64 libexec libx32 local mpi sbin share src
ls /usr/local
bin doc etc games include lib man sbin share src usr
그렇다면 두 개의 디렉토리는 어떤 차이가 있을까. 차이점은 다음과 같음
/usr
/usr
은 system 의 standard distribution 을 포함하고 있음. /usr
의 목적은 system-wide 한 파일들을 저장하고 관리하기 위한 목적으로 사용됨. executables, libraries, documentation, 그리고 다른 유저들과 system 에서 공유하기 위한 파일들을 관리함.
/usr/bin
(for executables)/usr/lib
(for libraries)/usr/share
(for shared data)/usr/include
(for header files). /usr
의 파일들은 system administrator 에 의해 관리되며, software upgrade 혹은 system 유지를 위해 업데이트 됨.
/usr/local
본 디렉토리는 standard distribution 에 포함되지 않은 software 들을 포함함. 따라서 system 에 'local' 하게 설치되는 소프트웨어들을 관리함. 따라서 'local' 하게 컴파일된 소프트웨어, third-party software 혹은 custom script 가 사용됨.
따라서 보통은, /usr/local
의 내용은 시스템 업그레이드를 하며 덮어쓰기가 되지 않으며 오직 /usr
만 덮어쓰기가 됨. 따라서 개발을 진행할 때, system upgrade 에 따라 변경되기 싫고, 버전을 유지하고 싶다면 /usr/local
디렉토리에 설치하는 것이 좋은 선택지임.
~/.local
추가적으로, 빌드를 하면서 홈 디렉토리에 다음과 같은 디렉토리를 확인할 수 있음. ~/.local
의 경우, 다른 유저의 사용을 '금지' 하고 오직 유저 본인만 접근할 수 있는 library, executables 들이 존재함. 그리고 system-level 에서도 사용할 수 없음.