[완료]automake 로 만들어지는 g++ 명령문의 옵션 순서 바꾸는 방법

oosap의 이미지

automake 문제로 내용이 조금 복잡해서 소스코드부터 보여드립니다.

Makefile.am

  1 INCLUDES        :=  -I./include\
  2                     -I../include\
  3                     -I$(ACE_ROOT)
  4 DEFINES         :=  -D_GNU_SOURCE\
  5                     -D__ACE_INLINE__
  6 CXXFLAGS        :=  @CXXFLAGS@\
  7                     -fno-strict-aliasing\
  8                     -fvisibility=hidden\
  9                     -fvisibility-inlines-hidden\
 10                     -O3\
 11                     -ggdb\
 12                     -pthread\
 13                     -Wall\
 14                     -W\
 15                     -Wpointer-arith\
 16                     -pipe\
 17                     -v\
 18                     $(INCLUDES)\
 19                     $(DEFINES)
 20 LDFLAGS         :=  @LDFLAGS@\
 21                     -Wl,-E -L$(ACE_ROOT)/lib\
 22                     -lACE -ldl -lrt
 23 
 24 SUBDIRS           = Iterative_Logging_Server Logging_Server Logging_Client
 25 noinst_PROGRAMS   = iterlogs clnts
 26 iterlogs_SOURCES  = Logging_Handler.h\
 27                     Logging_Server.h\
 28                     Iterative_Logging_Server/Iterative_Logging_Server.h\
 29                     Iterative_Logging_Server/Iterative_Logging_Server.cpp\
 30                     Logging_Server/Logging_Server.cpp\
 31                     Logging_Server/Logging_Handler.cpp
 32 
 33 clnts_SOURCES     = Logging_Client/Logging_Client.cpp
 34 
 35 clean :
 36         rm -rf *.o iterlogs clnts
 37         @echo 모든 파일을 지웠습니다.

configure.ac

  1 AC_INIT(IterativeLoggingServer, 0.0.1, email here)
  2 AM_INIT_AUTOMAKE(IterativeLoggingServer, 0.0.1)
  3 
  4 AC_PROG_CXX
  5 AC_PROG_MAKE_SET
  6 
  7 AC_CONFIG_FILES([Makefile
  8     Iterative_Logging_Server/Makefile
  9     Logging_Server/Makefile
 10     Logging_Client/Makefile])
 11 
 12 AC_OUTPUT
 13 

Makefile 생성 스크립트

  1 #!/bin/bash
  2 
  3 aclocal
  4 autoconf
  5 automake --foreign -a -c
  6 ./configure

만들어진 Makefile 을 사용한 make 과정중 링크를 수행하는 명령문

g++  -g -O2 -fno-strict-aliasing -fvisibility=hidden -fvisibility-inlines-hidden -O3 -ggdb -pthread -Wall 
-W -Wpointer-arith -pipe -v    -Wl,-E -L/home/user/ACE_wrappers/lib -lACE -ldl -lrt 
-o iterlogs Iterative_Logging_Server.o Logging_Server.o Logging_Handler.o  

여기서 에러가 발생됩니다. 문제는 main 함수의 심벌이 포함된 오브젝트 파일보다도 앞 자리에 라이브러리가 배치된 까닭입니다.
해결을 위해서는 -lACE -ldl -lrt 를 실행문 제일 뒤로 보내야 합니다.

그런데 문제는 지금의 환경이 automake 라는 것입니다. 제가 만든 파일은 위에 있는 Makefile.am 과 configure.ac 그리고 실행 스크립트가 전부입니다.

위에 있는 g++ 의 링크 실행문에서의 옵션의배치를 바꾸려면 어떻게 할 수 있을까요?

저는 지금 ACE 책 C++ Network Programming 의 예제를 실행해보는 중입니다. 예제는 제공된 것이지만 오토 메이크 파일들은 제가 만들었습니다. 그래서 좀 엉성합니다.

별론이지만 위의 에러가 반드시 나는 것은 아닙니다. 문제가 되는 라이브러리 옵션의 위치 문제는 동일하게 있는데 우분투 10.04와 11.10 중에서 11.10 에서만 에러가 발생합니다. 물론 gcc 버전도 상이합니다. autotools 버전도 상이합니다.

미리 감사드립니다.

ymir의 이미지

g++ 4.6 에서는 이 순서가 문제가 되나 보네요.
테스트 환경이 없어서 그러는데, "-lACE -ldl -lrt" 이 녀석들을 LDADD 로 빼면 어떻게 되나요 ??

만약 특별한 이유가 없다면, 그냥 g++ 4.4 로 내리는 것도 괜찮을 것 같네요.
apt-get 으로 g++-4.4 설치하고, update-alternatives 로 g++ 를 g++-4.4 로 설정해주면 될 것 같은데..

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

oosap의 이미지

정말 감사합니다.

g++  -g -O2 -fno-strict-aliasing -fvisibility=hidden -fvisibility-inlines-hidden -O3 -ggdb -pthread -Wall
 -W -Wpointer-arith -pipe -v    -Wl,-E -L/home/jour/ACE_wrappers/lib -o iterlogs 
Iterative_Logging_Server.o Logging_Server.o Logging_Handler.o -lACE -ldl -lrt 

LDADD 로 라이브러리들은 따로 명시해줘야 하나봐요.

제대로 링크 실행문의 맨 뒤에 라이브러리들이 배치 되었고 잘 링크 되었네요.

감사합니다~

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

구 버전(4.4.3) 에서는 에러가 나지 않고
신 버전(4.6.1) 에서만 에러가 발생했습니다.

에러가 나는게 맞는 것 같습니다. 컴파일타임 에러 덕분에 Makefile.am 의 오류를 잡은 것 같습니다.

LDFLAGS 는 링커 옵션만 담게 하고
LDADD 에서 라이브러리 목록을 담게 해야 하는 것 같아요.

다시한번 감사드립니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

ymir의 이미지

오래 전에 object 에 static library 추가할 때 LDADD 를 썼던 기억이 나서 써봤는데.
해결되었다니 다행이네요.

적어도 4.4 에서는 외부 라이브러리 링크 위치는 object 의 앞이나 뒤든 상관 없었는데..
4.6 에서는 반드시 object 뒤에 배치되어야 하는 것 같네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

jachin의 이미지

좋은 정보 감사합니다. LDADD의 역할이 강력해졌군요!

모르고 있었네요. ^^;

익명 사용자의 이미지

이름만 봐도 알수있는건데...

원래부터가 LDFLAGS는 플래그 지정이고 LDADD는 추가 라이브러리 적으라는거잖아....

LDADD의 역할이 강력해졌다니 먼 개솔...

jachin의 이미지

꿋꿋하시네요, 정말. ㅇㅅㅇ;

정말 제가 당신을 모르고 있는거라 믿고 있는거죠?

태클 걸어주시는 건 좋은데, 좀 더 영양가 있게 걸어보세요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.