[완료]automake 로 만들어지는 g++ 명령문의 옵션 순서 바꾸는 방법
글쓴이: oosap / 작성시간: 화, 2012/04/17 - 3:25오후
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 버전도 상이합니다.
미리 감사드립니다.
Forums:
음 ..
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 』
정말 감사합니다. g++ -g -O2
정말 감사합니다.
LDADD 로 라이브러리들은 따로 명시해줘야 하나봐요.
제대로 링크 실행문의 맨 뒤에 라이브러리들이 배치 되었고 잘 링크 되었네요.
감사합니다~
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
구 버전(4.4.3) 에서는 에러가 나지 않고 신
구 버전(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.
음 ..
오래 전에 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 』
와웅... 이건 저도 간과하고 있었는데...
좋은 정보 감사합니다. LDADD의 역할이 강력해졌군요!
모르고 있었네요. ^^;
아는척 쩐다 진짜...
이름만 봐도 알수있는건데...
원래부터가 LDFLAGS는 플래그 지정이고 LDADD는 추가 라이브러리 적으라는거잖아....
LDADD의 역할이 강력해졌다니 먼 개솔...
우와앙~ 오랫만에 나타나셨네요.
꿋꿋하시네요, 정말. ㅇㅅㅇ;
정말 제가 당신을 모르고 있는거라 믿고 있는거죠?
태클 걸어주시는 건 좋은데, 좀 더 영양가 있게 걸어보세요.
댓글 달기