2013-07-15 3 views
1

처음으로 autotools를 사용하고 있습니다 & Cie와 나는 분실했습니다. 나는 openwrt 환경에서 differents 패키지에 약 100 개의 동적 라이브러리를 생성한다. 나중에 바이너리로 dlopen + dlsym을 사용하여 라이브러리를 사용합니다. 이렇게하면 일종의 플러그인 시스템을 사용할 수 있습니다.openwrt config, autotools and library

이제 플러그인 시스템을 사용하지 않고 모든 라이브러리를 정적으로 링크하고 싶습니다. 기본적으로 내 라이브러리 A가 .config 파일에 정의되어 있고 내 바이너리와 링크되어 있다고 말하고 싶습니다. 이제 dlopen 기능을 사용하지 않고 dlsym functionnalities를 사용합니다.

나는 그것을 할 수 있지만 제 생각에는 매우 더러운 방법입니다. 패키지가 내 진 DL 디렉토리에 내 바이너리의

PKG_BUILD_DEPENDS+= +PACKAGE_LIBA:LIBA 
    ifdef CONFIG_PACKAGE_LIBA 
    CONFIGURE_ARGS+= --enable-LIBA 
    endif 
  • configure.ac의 패키지의 .config 메이크 파일에 정의되어있는 경우

    • 내 라이브러리를 사용하여
    DL 디렉토리

MYBINARY_LDADD = $ (LIBA_LIBS)

지금, 나는 도서관의 백을 위해 그렇게 할 필요가있는 Makefile.am 내 바이너리

AC_ARG_ENABLE([LIBA], 
    [AS_HELP_STRING([--enable-LIBA], [Enable link with LIBA (default no)])], 
    [ if test x"$enableval" = "xno" ; then LIBA="0" ; else LIBA="1" ; fi ], 
    [LIBA="0"]) 
if test "$LIBA" = "1" ; then 
    [LIBA="-la"] 
    AC_SUBST([LIBA_LIBS]) 
fi 
  • . 게다가 LIBA가 표준 라이브러리를 사용하고 있다면 수동으로 추가 할 필요가 있습니다 ... AUTOtools를 사용하는 것은 정말 아이러니합니다 ... 어쨌든 작동하지만 너무 못생긴 것입니다. 이것의 이점은 수정 만하면됩니다. 내 바이너리 Makefile/configure 및 모든 패키지가 아닙니다. 만약 내가 할 수만 있다면 Makefile만으로 할 수 있지만 여기서 나의 요구 사항 중 하나는 autotools를 사용하는 것이다. 또한 라이브러리를 설명해야하는 pc.in 파일을 사용하여 다른 솔루션을 시도했지만 제대로 사용할 수 없었습니다. 그리고이 솔루션을 따르는 것이 정말 깨끗한 지 확신하지 못했습니다.

    감사합니다. 아서.

답변

2

autotools은 모든 것을 자동으로 만드는 것은 일반적인 오해입니다. 대신 매우 명시 적이어야합니다. 와일드 카드를 사용하는 대신 모든 단일 소스 파일을 Makefile.am에 추가해야합니다.

PLUGIN_LIBS="" 
AC_ARG_ENABLE([LIBA], 
[AS_HELP_STRING([--enable-LIBA], [Enable link with LIBA (default no)])], 
[ test x"$enableval" = "xyes" && PLUGIN_LIBS="${PLUGIN_LIBS} -la" || true ]) 
AC_ARG_ENABLE([LIBB], 
[AS_HELP_STRING([--enable-LIBB], [Enable link with LIBB (default no)])], 
[ test x"$enableval" = "xyes" && PLUGIN_LIBS="${PLUGIN_LIBS} -lb" || true ]) 
# ... 
AC_SUBST([PLUGIN_LIBS]) 

당신이 것 실제로 :

어쨌든, 특정 문제에 대한, 난 당신이 하나의 변수로에 연결하는 데 필요한 모든 플러그인-라이브러리를 하나의 변수 (예 : MY_LIBS)를 creat에 넣어 것 두 경우 모두에서

PLUGIN_LIBS="" 
PLUGIN_BUILTIN([LIBA], [-la]) 
PLUGIN_BUILTIN([LIBB], [-lb]) 
# ... 

, 당신의 Makefile을 : 당신이 끝날 수 있도록, 반복 작업 (PLUGIN_LIBS에 libs와 추가 도움말 문자열을 설정, AC_ARG_ENABLE를 호출하는 테스트를 수행) 않는 M4-매크로를 만들 .다음과 같을 것입니다 :

MYBINARY_LDADD = $(PLUGIN_LIBS) 
+0

m4 매크로에 대한 귀하의 조언 주셔서 감사합니다. 지금까지 필자는 openwrt 환경의 .config 파일을 읽고 configure.ac, Makefile 등을 생성하는 쉘 스크립트를 작성했습니다 ... 또한 sed를 사용하여 코드에서 플러그인을 초기화하는 모든 함수를 생성했습니다. 매우 오래되고 큰 프로젝트의 빌드 프로세스를 수정해야 할 때 정말 유용합니다. 게다가 나는 Makefile에서 결코 와일드 카드를 사용하지 않는다. 단지'% .o : % .cpp'와'$ (CC) $ (CFLAGS) -c $ <'가 필요합니다. – ArthurLambert

+0

필자는 주로'autotools'가 어떤 파일이 프로젝트에 속해 있는지 자동으로 추측하려고하지 않을 것이라고 지적하고 싶었습니다. * auto *는 플랫폼 XY에서 프로젝트를 빌드하는 방법을 수학적으로 자동으로 결정하는 방법을 나타냅니다. –