0

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

现在我希望能够静态链接我的所有库,而不是使用我的插件系统。基本上我想说如果我的库 A 是在我的 .config 文件中定义的,请将其与我的二进制文件链接。所以现在我只是使用 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 来做到这一点,但我的要求之一是使用自动工具。我还尝试了另一种使用 pc.in 文件的解决方案,我必须在其中描述我的库,但我无法正确使用它。并且不确定遵循此解决方案是否真的很干净。

谢谢,亚瑟。

4

1 回答 1

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 宏(调用 AC_ARG_ENABLE、设置帮助字符串、进行测试、将库添加到 PLUGIN_LIBS),因此您最终得到:

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

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

MYBINARY_LDADD = $(PLUGIN_LIBS)
于 2013-07-16T12:43:16.430 回答