-Wl,--as-needed 옵션 문제

안녕하세요…
as-needed 옵션을 이용해서 실행파일을 작성 중인데…
undefined reference error가 발생해서 도움을 청하게 되었습니다.

먼저 a.o, b.o, c.o object 파일을 libtest.a로 묵었습니다.
그리고 final.c 라는 파일을 컴파일 하면서 link 시에 -Wl,–as-needed libtest.a를 줬는데…
a.o, b.o, c.o에서 가져다 쓰는 라이브러리에 정의된 API들이 전부 reference error가 발생합니다.
그래서 해당 라이브러리들을 final.c 컴파일 할 때 -l 옵션으로 직접 linking 해주었는데도
마찬가지입니다.

혹시 의심되는 부분 있으신지요?

–as-needed 옵션은 링크시 ld 에서 쓰이는 옵션이고
undefined reference 에러의 주요원인은

  1. final.c 코드에서 호출하는 api 함수명을 잘못 기입한경우
  2. final.c 코드에 호출하고자 하는 함수의 헤더파일들을 추가하지 않은경우
    #include "a.h"
    #include "b.h"
    #include "c.h"

제가 해본봐, ar rv libtest.a a.o b.o c.o 이런식으로 라이브러리 만들어서 링크해보니 잘됩니다.

gcc final.c -Wl,–as-needed libtest.a

문제는 컴파일시에 커맨드라인에서 gcc 를 호출할경우는 위의 옵션이 잘적용이 되지만
make 스크립트 혹은 쉘 명령으로 컴파일 할경우는 오타에 의해 gcc 대신에 cc1 이 동작해 위와 같은 에러가 발생합니다.

주의: -Wl,–as-needed 옵션에 공백문자없음. 공백있으면 gcc 대신에 cc1 이 동작합니다.

맨 페이지를 봐서는(man ld의 --as-needed) 다이나믹 링크와 연관되있는것 같습니다.

스테틱 라이브러리를 사용할때는 의미 없는 옵션 같습니다
(영어가 짧은 관계로 추측입니다)

gcc -Wall final.c libtest.a -o final
gcc -Wall final.c -ltest -L. -o final

전 에러가 안나네요

그리고 참고로 선언에 문제가 있으면(헤더파일 관련) -Wall 옵션을 주면

"warning: implicit declaration of function …" 이런 경고문이 나옵니다.

책장사하는건 아니고 마음에 드는 책이 있어서 소개해드립니다.

한빛미디어
컴파일러 구조와 원리
아오키 미네로우 지음
이영희 옮김

4부에 링크와 로드쪽 내용이 쉽게 잘 설명돼있네요