openwrt配置,autotools和库

时间:2013-07-15 13:54:24

标签: autotools autoconf automake openwrt

我第一次使用autotools& Cie和我迷路了。我在openwrt环境中的不同包中生成了大约一百个动态库。后来在二进制文件中,我使用dlopen + dlsym来使用我的库。这允许我使用一种插件系统。

现在我希望能够静态链接我的所有库,而不是使用我的插件系统。基本上我想说如果我的.config文件中定义了我的库A,请将其与我的二进制文件链接。所以现在我只使用dlsym功能而不使用dlopen功能。

我能够做到,但在我看来,这是非常肮脏的。

  • 如果在.config中定义了包,请使用我的库 我的二进制包的Makefile
  PKG_BUILD_DEPENDS+= +PACKAGE_LIBA:LIBA
  ifdef CONFIG_PACKAGE_LIBA
     CONFIGURE_ARGS+= --enable-LIBA
  endif
  • 我在dl目录中的二进制文件的configure.ac
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
  • 我在dl目录中的二进制文件的Makefile.am
  

MYBINARY_LDADD = $(LIBA_LIBS)

现在,我需要为数百个库做到这一点。此外,如果LIBA正在使用例如标准库我需要手动添加...相当讽刺的是使用像这样的AUTOtools ...无论如何它工作但是很丑..这样做的好处是我只需要修改我的二进制Makefile / configure而不是所有包。如果我能用Makefile做到这一点,但我的要求之一就是使用autotools。我还尝试使用pc.in文件的另一个解决方案,我必须在其中描述我的库,但我无法正确使用它。并且不确定遵循此解决方案是否真的很干净。

谢谢, 亚瑟。

1 个答案:

答案 0 :(得分:3)

这是一种常见的误解,autotools会使一切自动化。相反,你必须非常明确,例如您必须将每个源文件添加到Makefile.am,而不是使用通配符。

无论如何,对于您的具体问题,我会创建一个变量(例如MY_LIBS)并将您需要链接到的所有插件库放入此单个变量中:

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])

实际上你会创建一个m4-macro来执行重复的任务(调用AC_ARG_ENABLE,设置帮助字符串,进行测试,将libs添加到PLUGIN_LIBS),所以最终得到:

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

在这两种情况下,你的Makefile.am看起来都像:

MYBINARY_LDADD = $(PLUGIN_LIBS)