2011-11-08 5 views
1

Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool, 6 장 (libtool을 사용한 라이브러리 구축)에서는 링크 라이브러리가 example입니다.libabc.so 대신 libabc.a에 링크하는 방법은 무엇입니까?

예에서 라이브러리 libjupiter.so은 다른 라이브러리 libjupcommon.a에 연결됩니다. libjupiter.so에 PIC가 필요하므로 libjupcommon.a이 아니기 때문에 첫 번째 시도가 실패합니다. 작성자는 libjupcommon_a_CFLAGS = -fPIC을 추가하여 수정했습니다. 그것은 훨씬 나아졌지만 경고는 '공유 라이브러리 libjupiter.la를 정적 라이브러리 ../common/libjupcommon.a에 연결하면 이식 할 수 없습니다! '이 나타납니다.

따라서 저자는 libtool을 사용하여 libjupcommon.la을 빌드하여 Makefile.am을 다시 수정합니다. libjupiterlibjupcommon.la에 링크되어 있습니다. 이와 같이 :

noinst_LTLIBRARIES = libjupcommon.la

libjupcommon_la_SOURCES = jupcommon.h print.c

...

libjupiter_la_LIBADD =

. ./common/libjupcommon.la

이번에는 문제가 없습니다. 이제


, 내 문제 :

나는 도서관이 단지 libjupiter 요구 libjupcommon 같은 다른 라이브러리를 필요로합니다. 차이점은 내 libjupcommon이 다른 프로젝트에서 가져 와서 시스템에 설치되었다는 것입니다. noinst_LTLIBRARIES이 아닙니다. .so.a 버전이 있습니다. 위 예제와 같이 libjupcommon.la을 연결하면 .so이 선택되지만 동적 연결 관계는 필요하지 않습니다. 책의 예와 같이 .a에 연결하고 싶습니다.

.a에 명시 적으로 연결하면 (_LIBADD = .a 파일을 사용하여) 사용 가능한 라이브러리가 제공되지만 '휴대용이 아닙니다'라는 경고가 표시됩니다.

이 경우 .a에 연결할 수있는 적절한 방법은 무엇입니까?

추 신 : book's official site에서 예제를 다운로드하십시오. autotools/book/jupiter-libtool-ch6/common에서 Makefile.am의 noinst_LTLIBRARIESlib_LTLIBRARIES으로 수정하는 것이 내 문제와 유사해야합니다.

+0

어떤 라이브러리를 만들 수 있습니까? 공유 라이브러리 또는 정적 라이브러리? 공유 라이브러리를 빌드한다면 설치된'.a' 라이브러리와 링크하는 것은 의미가 없으므로 libtoool 경고입니다. 정적 라이브러리를 빌드하는 경우 명시 적으로 그렇게 지정해야합니다 (ldav1s 응답 참조). – adl

+0

공유 라이브러리를 만들고 싶습니다. 설치된'.a'가 PIC 일지라도 말이되지 않습니다. 왜 그래야만하지? –

+0

그러나이 경우'.a'는 Libtool에 의해 생성되지 않았습니다. 내가 아는 한, Libtool에 의해 설치된'.a' 파일은 PIC가 아닙니다. – adl

답변

2

시도 할 수있는 몇 가지 사항이 있습니다. --disable-shared 옵션을 사용하여 configure을 실행하여 공유 라이브러리의 컴파일을 해제하고 정적 라이브러리를 libfoo_LIBADD에 다시 추가 할 수 있습니다. -staticlibfoo_LDFLAGS에 추가하여 libtool이 정적으로 빌드되도록 할 수 있습니다 (다시 정적 라이브러리가 libfoo_LIBADD에 추가됨).

편집 : 정적 라이브러리와 공유 라이브러리가 모두 필요하므로 위의 코드는 작동하지 않습니다.추가

시도 : configure.ac에

AC_CHECK_LIB([abc],[some_function_in_libabc]) 

. 이 구조를 사용하여 (공유 다른 모든 링크를 유지하면서)

+0

정적 인 것을 컴파일하는 것을 의미합니까? 나는 그것이 효과가있을 것이라고 생각한다. 하지만 정적이고 동적 인'libjupcommon '이 필요합니다. 'libjupiter.so'가 정적 인 것을 링크하도록 만듭니다. –

+0

noinst_LTLIBRARIES는 편의 라이브러리이며 빌드 중 일부 실행 가능 라이브러리 또는 다른 라이브러리와 다시 링크됩니다. – ldav1s

+0

libtool 코드를 읽은 후에 정적 라이브러리 만 빌드하면됩니다. libfoo.so와 마찬가지로 libfoo.a libfoo_static.a. 감사합니다 ldav1s. –

1

당신은 라이브러리에 정적 링크를 강제 할 수

 
-Wl,-Bstatic -Wl,-whole-archive -Xlinker -l$1 -Wl,-no-whole-archive -Wl,-Bdynamic 

은 라이브러리 이름으로 위의 $ 1 교체합니다.

설명 : 위의 대부분의 괴물은 libtool이 명령 행 인수를 재조정 할 것이라는 사실을 극복하는 것입니다. -Xlinker를 사용하면 libtool이 -l $ 1을 무시하고 다시 정렬하지 않습니다. -Wl, -Bstatic은 모든 후속 라이브러리를 정적으로 링크하도록 링커에 지시합니다. -Wl, -Bdynamic은 다른 라이브러리의 동적 연결로 다시 돌아갑니다.