2014-06-05 5 views
1

을 사용하여 정적 libtool이 라이브러리에 공유 라이브러리를 연결내가이 디렉토리 구조를 가지고 automake에

LIBA에서,이처럼 보이는 Makefile.am이
prog/libA 
prog/libB 

:

은 LAPACK이
noinst_LTLIBRARIES = libA.la 
libA_la_SOURCES = ... 
libA_la_LIBADD = ... $(LAPACK) 

곳을 내 시스템의 lapack 설치. 이것은 예상대로 작동합니다. 그러나 libB에서 나는 이것을 가지고있다 :

noinst_LTLIBRARIES = libB.la 
bin_PROGRAMS = compLibB 
libB_la_SOURCES = ... 
compLibB_SOURCES = ... 
libB_LIBADD = $(top_builddir)/libA/libA.la ... 
compLibB_LDADD = libB.la 

이것은 작동하지 않는다. 마지막 라인을

compLibB_LDADD = libB.la $(LAPACK) 

으로 변경하지 않으면 compLibB의 링크 단계에서 LAPACK에 대한 정의되지 않은 참조가 불평하지만 불필요한 것처럼 보입니다. libA.la 편의 lib를 빌드 할 때 이미 $(LAPACK)에 링크되어 있지 않습니까? 현재 compLibB가 libA의 세부 사항에 관심을 가져야하기 때문에 부정하다. libA 빌드 단계에서 LAPACK 라이브러리에 링크 할 수있는 방법이 없으므로 compLibB 빌드 단계에서 다시 지정할 필요가 없습니다.

+0

[Windows DLL 전달자 또는 MacOS reexport \ _library와 유사한 Linux] 가능한 복제본 (http://stackoverflow.com/questions/22764734/linux-equivalent-of-windows-dll-forwarders-or-macos-reexport- 도서관) –

+0

일하는 것으로되어 있습니다! 예를 들어, xapian omega app (http://xapian.org/docs/xapian-omega-1.2.21/NEWS)에서 이와 동일한 접근 방식이 사용됩니다. 그러나 그것은 아닙니다 - 오메가 응용 프로그램을 빌드하는 동안 질문에 설명 된 것과 동일한 문제가 발생합니다 ... – Nik

답변

1

libA.la 편의 라이브러리를 만들 때 이미 $ (LAPACK)으로 링크하지 않았습니까?

링커에서 이미 말한대로 아니요. 편리 라이브러리 인 libA.la은 정적 라이브러리 (오브젝트 파일의 모음)와 다소 비슷합니다.

지금 compLibB이 LIBA의 세부 사항에 관여 할 가지고 있기 때문에 부정이다. libA 빌드 단계에서 LAPACK 라이브러리에 링크 할 수있는 방법이 없으므로 compLibB 빌드 단계에서 다시 지정할 필요가 없습니다.

최종 링크가 아직 없기 때문에 libA.la이 빌드 될 때 LAPACK 라이브러리를 지정할 필요가 없습니다. libA 공유 라이브러리를 만들지 않고 원하는 것을 성취 할 수있는 방법이 없습니다.

0

_LIBADD은 종속성 전환 및 작업을 수행하기위한 것으로 실제 작동하기로되어 있습니다. 한편, $(top_builddir)을 사용하면 다른 문제가 발생할 수 있습니다. libtool은 상대 경로로 링크 된 라이브러리와 절대 경로로 연결된 라이브러리를 다르게 처리하기 때문입니다.