2017-12-27 178 views
1

我最近遇到了一個庫,它在公共頭文件中使用了像HAVE_FEATUREFOO這樣的變量。如何在公共頭文件中正確使用`AC_DEFINE`和`AC_DEFINE_UNQUOTED`定義的變量?

它還包括它們的聲明#include "config.h"。這些聲明也用於結構聲明中,並有條件地刪除結構成員。用於庫構建的值的不一致性以及依賴程序的構建將導致內存損壞。

因此,使用該庫和它的頭可能導致以下結果:

  • #include "config.h"失敗,
  • 或在運行時內存損壞。

我對自動工具非常陌生,但經過我發現的一些研究後,他們使用AC_DEFINE or AC_DEFINE_UNQUOTED進行了定義。而且,config.h使用AC_CONFIG_HEADERS生成。

隨着進一步的研究,我發現include_HEADERS,它安裝標題。並且,標題config.h正確安裝,如果它被添加到列表中。

是不是正確的做法,通過AC_CONFIG_HEADERS安裝config.h自動工具生成的頭文件?

回答

1

生成的config.h文件不應該包含在用戶代碼中。這意味着你的庫頭應該獨立於配置測試,你不應該安裝config.h

1

是不是正確的做法,安裝AC_CONFIG_HEADERS autotools生成的config.h頭文件?

如果其他安裝頭屬於該項目依靠config.h,那麼,config.h必須安裝了。這是唯一可行的方法,因爲構建的軟件取決於在config.h中記錄的構建時構建系統屬性。一般來說,你不能指望在事實之後正確地重新創建。

但安裝頭不應該#include一個自動工具config.h頭擺在首位,也不應該依靠一個間接的影響。那麼,如果文件名爲config.h的文件不是安裝在包含文件搜索路徑中,或者是在可能有可能期望有時被添加到包含路徑中的任何目錄中。碰撞的風險太大 - 在某種程度上,標題名稱更爲重要,但更重要的是這些標題定義和依賴的宏名稱。

底線:Autotools config.h文件用於構建與之相關聯的項目,而不是使用構建的結果。特別是,當這樣的項目是或包含一個圖書館時,config.h不適合圖書館自己的頭文件使用任何方式,或者不想被使用該圖書館的代碼直接使用。 Autotools提供了不同的機制,通過這些機制可以通過定製用於安裝的頭文件來記錄構建時系統配置。


那麼,這就讓你對圖書館有什麼要求嗎?我認爲你所描述的問題是代碼質量差的一個表現,所以你應該強烈考慮尋找替代方案。您可能會嘗試修復該項目,但這不太值得您花時間,尤其是作爲Autotools新手。

相關問題