【问题标题】:openwrt config, autotools and libraryopenwrt 配置、自动工具和库
【发布时间】:2013-07-15 13:54:23
【问题描述】:

我第一次使用 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 文件的解决方案,我必须在其中描述我的库,但我无法正确使用它。并且不确定遵循此解决方案是否真的很干净。

谢谢, 亚瑟。

【问题讨论】:

    标签: autotools autoconf automake openwrt


    【解决方案1】:

    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)
    

    【讨论】:

    • 感谢您关于 m4 宏的提示,我会检查一下。到目前为止,我编写了一个 shell 脚本,它读取我的 openwrt 环境的 .config 并生成 configure.ac、Makefile 等……我还使用 sed 生成了所有函数来在我的代码中初始化我的插件。当您必须修改一个非常古老且大型项目的构建过程时,它真的很有帮助。此外,我从不在 Makefile 中使用通配符。只需要一行:%.o: %.cpp$(CC) $(CFLAGS) -c $<
    • 我主要想指出的是,autotools 不会尝试自动自动猜测哪些文件属于您的项目。 auto 指的是它将如何auto 自动确定如何在平台 XY 上构建您的项目(您可能从未听说过)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多