[英]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
,但是我的軟件可能以禁用foobar的方式進行編譯,因此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
,通過將CPPFLAGS
或foo_CPPFLAGS
相關定義與foo_CPPFLAGS
一起AC_SUBST
給Makefile.am
進行源代碼構建,或者將AC_SUBST
給foo.h.in
來在配置時生成標頭。 很多config.h
是測試生成的噪聲。 它需要更多基礎架構,但這是我的首選。 除非您對自動工具感到滿意,否則我不建議您使用這種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.