簡體   English   中英

使用自動工具為共享庫正確安裝config.h

[英]Correct installation of config.h for shared library using autotools

我正在轉換一個使用自動工具構建系統的C ++程序來使用共享庫,並介紹了libtool的用法。 程序的大多數功能都放置在共享庫中,該共享庫由主程序加載,以便將來其他程序可以訪問公共代碼。

在整個程序和庫源代碼中,自動標頭生成的config.h與通常的宏一起使用:

#if HAVE_CONFIG_H
# include <config.h>
#endif

在configure.ac中,我使用宏來生成它:

AC_CONFIG_HEADERS([config.h])

我的問題是,我是否需要安裝config.h以使其他人能夠使用我的庫?如果是,執行該操作的適當方法是什么?是否應將其重命名以避免沖突等?

我在此找到的最多信息是:

http://www.openismus.com/documents/linux/building_libraries/building_libraries#installingheaders

但這幾乎不是官方消息。

永遠不要安裝和autoheader的config.h

庫用戶需要的最后一件事是宏從config.h泄漏出來的干擾。 您的庫可能具有HAVE_FOOBAR ,但是我的軟件可能以禁用foob​​ar的方式進行編譯,因此HAVE_FOOBAR將破壞我的編譯。

存檔中AX_PREFIX_CONFIG宏是一種變通方法,其中所有內容都添加了前綴。

更好的方法是使用以下行創建模板文件(例如blargconfig.h.in ):

typedef @BLARG_TYPE@ blarg_int_t;

@BLARG_RANDOM_INCLUDE@

然后AC_SUBST()configure.ac那些變量:

AC_SUBST(BLARG_TYPE, ["unsigned short"])
AC_SUBST(BLARG_RANDOM_INCLUDE, ["#include <somerandomheader.h>"])

然后將其列為輸出文件:

AC_CONFIG_FILES([Makefile
                 src/Makefile
                 ...
                 include/blargconfig.h])

.h文件應使用nodist_include_HEADERS列出; .h.in文件將自動分發,因為它已在AC_CONFIG_FILES列出。

此類文件的目標位置通常是$libdir/packagename/include 例如 ,請參閱GLib ,盡管它們會生成沒有模板的glibconfig.h (通過自動將整個創建代碼內嵌在configure.ac ,如自動書中所建議的那樣 )。 與使用AC_SUBST ,我發現這種方法難以維護,但是更靈活。

當然,為了幫助編譯器找到依賴於平台的標頭,您可能還希望像GLib一樣編寫pkgconfig腳本。

如果它影響界面,則需要安裝config.h 實際上,如果標頭需要#define ,則不僅需要.cc實現/編譯單元。

如果config.h有問題,則可以在AC_CONFIG_HEADERS宏中指定另一個名稱。 例如AC_CONFIG_HEADERS([foo_config.h])

假設automake ,安裝標頭的最簡單方法是:

nodist_include_HEADERS = foo_config.h

在頂層Makefile.am nodist前綴告訴automake生成了foo_config.h而不是與軟件包一起分發。

如果不使用automake,請在$includedir安裝foo_config.h 對於生成的標頭, $exec_prefix/include可以說是一個更正確的位置,但實際上,前一個位置很好。


我避免使用config.h ,通過將CPPFLAGSfoo_CPPFLAGS相關定義與foo_CPPFLAGS一起AC_SUBSTMakefile.am進行源代碼構建,或者將AC_SUBSTfoo.h.in來在配置時生成標頭。 很多config.h是測試生成的噪聲。 它需要更多基礎架構,但這是我的首選。 除非您對自動工具感到滿意,否則我不建議您使用這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM