Makefile 문법 질문.

kkb의 이미지

Makefile에서

install-lib:
        install -c -m 755 $(BUILD_DIR)/usr/lib/libxxx.so.1.0.1 $(INSTALL_DIR)/usr/lib
        cd $(INSTALL_DIR)/usr/lib && ln -sf libxxx.so.1.0.1 libxxx.so.1

라이브러리를 위와 같이 설치하도록 했는데
라이브러리 버전이 바뀔 경우에도 동일하게 사용할 수 있도록 하려면 어떻게 해야 할까요?

김정균의 이미지

library 는 libtool 을 이용해서 build, install 시키면 저런 버전 넘버링 해결을 알아서 해 줍니다. 아니면 아예 automake 를 이용해서 Makefile 을 생성하면 library 의 경우에는 알아서 libtool 이 있으면 libtool 로 빌드를 하게 됩니다.

cmake 나 automake 에 대해서 알아 보시면 도움이 될 것 같습니다.

kkb의 이미지

답변 감사합니다.

$ libtool --mode=install install -c /usr/lib/libxxx.la ~/test_lib
libtool: install: install -c /usr/lib/.libs/libxxx.so.1.0.1 /home/test/test_lib/libxxx.so.1.0.1
install: cannot stat '/usr/lib/.libs/libxxx.so.1.0.1': No such file or directory

직접 빌드한 디렉토리에서 실행하면 install이 되는데
/usr/lib 등의 현재 설치되어 있는 디렉토리에서는 실행이 안되네요.

/usr/lib 에서는 아래와 같이 libxxx.la과 libxxx.so.1.0.1이 동일한 경로에 위치하는데
/usr/lib/libxxx.la
/usr/lib/libxxx.so.1.0.1

빌드한 디렉토리에서 처럼
.libs 에서 .so 파일을 찾기 때문인 것 같은데
위치를 지정해주거나 다른 방법이 있을까요?

김정균의 이미지

libtool 로 xxxx.la 를 install 하게 되면, xxx.la 파일의 libdir 경로에 있는 dlname 을 install 하게 됩니다. 즉, libxxx.la 파일의 libdir 경로가 다음과 같이 되어 있다는 의미 입니다.

# Directory that this library needs to be installed in:
libdir='/usr/lib/.lib'

/usr/lib/libxxx.la 가 배포된 것이라면, libxxx.la 배포에 install 될 경우의 경로에 대한 조치가 취해지지 않은채 배포가 되었을 것이며, 또는 /usr/lib 에서 해당 library 를 빌드했을 수도 있을 것 같네요. 일단은 현재의 문제는 libxxx.la 의 libdir 변수값이 제대로 설정이 되지 않은 것이 문제 입니다.

단순히 위의 상황에서의 이슈만 fix 한다면 libxxx.la 의 libdir 경로를 수정해서 해결을 할 수는 있지만, 실행된 명령이 수동으로 한 것이 아니라 Makefile 이나 기타 어떤 프로그램에서 호출된 명령이라면, libxxx.la 의 libdir 값을 해결을 해야 이슈를 해결할 수 있을 것 같습니다.

kkb의 이미지

/usr/lib/libxxx.la를 제가 수정하는 것은 권한이 조금 부담스러워서
다른 방법을 생각해봐야 하겠네요.
답변 감사했습니다.

kkb의 이미지

$ ls -l libxxx.so
lrwxrwxrwx 1 root root 4 Oct 26 17:30 libxxx.so -> libxxx.so.1.0.1

libxxx.so 파일이 링크되어 있는 버전을 확인해서
install 하는 방법은 어떨까요?
링크되어 있는 버전 값을 변수 등으로 어떻게 처리할 수 있을까요?

김정균의 이미지

질문을 하신 것을 보면.. Makefile 에서 system library 경로에 있는 파일을 install 을 시키려고 하는 것 같습니다.
이런 방식은 별로 좋은 방식은 아니라고 보여집니다.

이렇게 대답할 수 밖에 없는 이유는, 질문 자체에서 님이 현재 하고 있는 작업이 어떤 작업인지 알 수가 없습니다.
단순히 library 를 새로 만들어서 빌드/배포 하는 것이라면 libtool 로 build 를 하고 libtool 로 배포를 하면 문제가 없는데, la 파일을 건드리기 힘들다고 하는 것으로 보아서는 이미 배포가 되어진 다른 라이브러리를 또 다시 배포를 하려는 형태로 밖에 보이지를 않기 때문 입니다.

즉, 무엇을 하고 있는지 판단이 되지 않아, 위의 질문에는 이렇게 답을 할 수 밖에 없을 것 같네요.

원하는 작업을 script 로 만들어서, Makefile 에서 실행 시키시면 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.