pylibmc 설치 중 'libmemcached/memcached.h' file not found

고병찬·2024년 9월 14일

TIL

목록 보기
32/54

들어가며

Writing your first contribution for Django를 따라하고 있던 중이었다. 중간 즈음에 test suit을 실행하기 위해 의존성 라이브러리를 설치해야 했다.
그런데 그 중 하나인 pylibmc를 설치하는 과정에서 다음과 같은 에러가 발생했다.

  error: subprocess-exited-with-error
  × Building wheel for pylibmc (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [6 lines of output]
      In file included from src/_pylibmcmodule.c:34:
      src/_pylibmcmodule.h:42:10: fatal error: 'libmemcached/memcached.h' file not found
      #include <libmemcached/memcached.h>
               ^~~~~~~~~~~~~~~~~~~~~~~~~~
      1 error generated.
      error: command '/usr/bin/clang' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.

문제 원인 분석

에러 메세지를 한줄 한줄 살펴보면 다음과 같다.

error: subprocess-exited-with-error
× Building wheel for pylibmc (pyproject.toml) ... error
│ exit code: 1

pylibmc 패키지의 휠(wheel) 빌드에 실패했다. 휠은 설치를 빠르고 쉽게 하기 위한 사전 컴파일된 바이너리 형식이다.

fatal error: 'libmemcached/memcached.h' file not found
#include <libmemcached/memcached.h>

빌드 과정에서 libmemcached/memcached.h 헤더 파일을 찾지 못했다.
pylibmc는 Python에서 Memcached 서버와 상호 작용하기 위한 고성능 클라이언트 라이브러리로 Memcached 서버와 상호 작용하는 데 필요한 libmemcached라는 C 라이브러리에 의존하지만 해당 라이브러리를 찾지 못하고 있다.

error: command '/usr/bin/clang' failed with exit code 1

컴파일러(clang, macOS에서 사용)가 빌드 과정에서 필요한 libmemcached 헤더를 찾지 못하고 있다.

문제 해결

우선 libmemcached를 설치했다.

gpt는 brew로 설치 가능하다고 한다.

brew install libmemcached

실제로 brew search로 보면 설치할 수 있다.

google에 libmemcached라고 검색해서 한번 더 확인해보았었는데 비슷한 이름의 다른 라이브러리가 있어서 libmemcached-awesome 순간 헷갈렸었다.

그리고 다시 pip install pylibmc를 해도 여전히 libmemcached를 찾지 못하고 있다.

그래서 pylibmc를 설치할 때 libmemcached의 위치를 명시적으로 넣어줘야 한다. 검색해보니 나와 똑같은 문제를 겪은 글이 있었다. 블로그 글을 따라하니 깔끔하게 해결되었다.

간단히 적자면

libmemcached의 위치를 바로 찾지 못하는 것은 일반적인 경로에 설치되지 않아서라고 한다.

brew info libmemcached

//result
(djangodev) ~ % brew info libmemcached
==> libmemcached: stable 1.0.18 (bottled)
C and C++ client library to the memcached server
https://libmemcached.org/
Installed
/opt/homebrew/Cellar/libmemcached/1.0.18_2 (232 files, 2.5MB) *
...

경로를 확인한 뒤

LIBMEMCACHED=/opt/homebrew/Cellar/libmemcached/1.0.18_2 pip install pylibmc

이렇게 libmemcached 라이브러리 이름을 그대로 사용해서 환경 변수를 만들어 라이브러리의 경로를 주면 된다고 한다.

마무리

라이브러리가 의존성을 찾지 못할 때 경로를 어떻게 알려줘야하는지 방법을 몰랐는데 알게되었다.

그런데 위 방법이 모든 경우에 다 되는건지는 잘 모르겠다.
그래서 gpt한테 물어보니까 CFLAGS나 LDFLAGS를 써도 된다고 하는데 나중에 좀 더 찾아봐야할 것 같다.

profile
안녕하세요, 반갑습니다.

0개의 댓글