2013-07-15 34 views
1

我第一次使用autotools & Cie和我迷路了。我在不同的軟件包中在我的openwrt環境中生成了大約一百個動態庫。後來在一個二進制文件中,我使用dlopen + dlsym來使用我的庫。這使我可以使用一種插件系統。openwrt配置,autotools和庫

現在我想能夠靜態鏈接所有我的庫,而不是使用我的插件系統。基本上我想說如果我的庫A是在我的.config文件中定義的,請將它與我的二進制文件鏈接起來。所以,現在我只使用dlsym函數而不使用dlopen特性。

我能夠做到這一點,但在我看來,以非常骯髒的方式。

  • 使用我的圖書館,如果包在包的我二進制
在DL目錄我的二進制
PKG_BUILD_DEPENDS+= +PACKAGE_LIBA:LIBA 
    ifdef CONFIG_PACKAGE_LIBA 
    CONFIGURE_ARGS+= --enable-LIBA 
    endif 
  • configure.ac的的.config Makefile中定義
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 
  • 我二進制的Makefile.am在DL目錄

MYBINARY_LDADD = $(LIBA_LIBS)

現在,我需要做的是對圖書館的百名。此外,如果LIBA正在使用例如標準庫,我需要手動添加它...很諷刺的是,使用AUTOtools這樣的...無論如何它工作,但很醜陋..這樣做的好處是,我只需要修改我的二進制Makefile/configure而不是所有的軟件包。如果我能用Makefile做到這一點,但我的要求之一是使用autotools。我也嘗試了pc.in文件的另一個解決方案,我必須描述我的庫,但是我無法正確使用它。並不確定遵循這個解決方案是否真的很乾淨。

謝謝, 亞瑟。

回答

2

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 。我會看起來像:

MYBINARY_LDADD = $(PLUGIN_LIBS) 
+0

感謝您與m4宏的技巧,我會檢查它。直到現在,我寫了一個shell腳本,讀取我的openwrt環境的.config文件,並生成configure.ac,Makefile等等......我還使用sed生成了所有函數,以在我的代碼中初始化我的插件。當你需要修改一個非常古老的大項目的構建過程時,它確實非常有用。此外,我從不在Makefile中使用通配符。只需要一行:'%.o:%.cpp'和'$(CC)$(CFLAGS)-c $ <'。 – ArthurLambert

+0

我主要想指出的是,'autotools'不會嘗試* auto * matically猜測哪些文件屬於您的項目。 * auto *指的是它將如何*自動*通過平臺找出如何在平臺XY上構建項目(您可能從未聽說過)。 –