我第一次使用autotools& Cie和我迷路了。我在openwrt环境中的不同包中生成了大约一百个动态库。后来在二进制文件中,我使用dlopen + dlsym来使用我的库。这允许我使用一种插件系统。
现在我希望能够静态链接我的所有库,而不是使用我的插件系统。基本上我想说如果我的.config文件中定义了我的库A,请将其与我的二进制文件链接。所以现在我只使用dlsym功能而不使用dlopen功能。
我能够做到,但在我看来,这是非常肮脏的。
PKG_BUILD_DEPENDS+= +PACKAGE_LIBA:LIBA ifdef CONFIG_PACKAGE_LIBA CONFIGURE_ARGS+= --enable-LIBA endif
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
MYBINARY_LDADD = $(LIBA_LIBS)
现在,我需要为数百个库做到这一点。此外,如果LIBA正在使用例如标准库我需要手动添加...相当讽刺的是使用像这样的AUTOtools ...无论如何它工作但是很丑..这样做的好处是我只需要修改我的二进制Makefile / configure而不是所有包。如果我能用Makefile做到这一点,但我的要求之一就是使用autotools。我还尝试使用pc.in文件的另一个解决方案,我必须在其中描述我的库,但我无法正确使用它。并且不确定遵循此解决方案是否真的很干净。
谢谢, 亚瑟。
答案 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)