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