2013-08-16 26 views
6

我的項目使用GNU autotools編譯(aclocal && autoconf && ./configure && make)。我想使用Boost,我希望其他人也能夠編譯它。如何在GNU Autotools項目中加入Boost?

  1. 我應該將Boost放在我的項目的目錄中,還是依靠系統的Boost?
  2. 我該如何告訴autotools使用Boost?我谷歌搜索,並發現很多聲稱做到這一點的m4文件 - 但我應該把這些m4文件放在哪裏?我可以在我的/usr/share/aclocal目錄中存儲一個,但是這並不能幫助其他人想要使用./configure && make編譯該項目。

回答

0
  1. 我倒是絕對依靠系統的升壓裝置。 IIRC,我最後一次構建Boost時,它需要非標準工具(用於autoconf所需的便攜式工具)供Boost構建。它也花了很長時間。
  2. AC_CONFIG_MACRO_DIR就是那些.m4文件去

    AC_CONFIG_MACRO_DIR([m4]) 
    

,其中宏是在 「M4」 目錄。我期望各種Boost .m4宏能夠告訴configure Boost包查找什麼(用於多個Boost安裝)以及它在哪裏(非標準安裝)。

+0

謝謝。你可以舉一個如何使用'AC_CONFIG_MACRO_DIR'的例子 - 我覺得交流困惑。另外:如果用戶按照網站的指示安裝Boost,AC會找到它嗎?我想要錯誤消息告訴他們該怎麼辦「Error:Boost is required。Install on as directions on http:// ...」 – SRobertJames

+0

系統的Boost可能已過時和/或不兼容,因此您可能必須在你的主目錄下安裝一個不同的版本(當你沒有root權限的時候)。 – DanielKO

+0

在這種情況下,我可能會尋找一個可以工作的預編譯版本Boost。如果不這樣做,你可能會爲已安裝的Boost版本打補丁或者從源代碼下載Boost並構建它。 – ldav1s

1

有一個很好的boost.m4宏,你可以在你的項目中包含m4子目錄。這些宏位於AC_CONFIG_MACRO_DIR([m4]),位於configure.ac

ACLOCAL_AMFLAGS = -I m4 --install添加到頂級Makefile.am,使用automake

這也是爲什麼它是這樣一個良好的宏觀:

BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND]) 

這將定義BOOST_CPPFLAGS,您可以添加到CPPFLAGS,在AC_SUBST使用等

對於個人升壓組件,它可以指定調試構建,靜態構建等。但是(通常)多線程動態庫是最好的,例如,

BOOST_FILESYSTEM([mt]) 

將定義爲BOOST_FILESYSTEM_LIBSBOOST_FILESYSTEM_LDFLAGS。作爲另一個好處,如果庫依靠,說,Boost.System,那麼這些庫的依賴將被自動添加到LIBSLDFLAGS


你應該只指定一個升壓安裝需要,而不是試圖分發它。它可以從源代碼或預編譯包輕鬆構建和安裝。前者需要很長時間,但最好在系統上進行「優化」構建。有很多軟件可以使用(穩健和優化的)Boost實現。

然後如果沒有可用的版本,則使用BOOST_REQUIRE錯誤消息。

15

The ArchiveAX_BOOST_*

我切換到boost.m4一段時間,但它太痛苦了,我可以在boost.m4完成對第二個庫的測試之前,在vim中用完整的Boost路徑編輯Makefile文件。

我回到了檔案館,很高興知道boost宏正在被主動維護;然後我開始從我的每一個項目中清除boost.m4。

從用例相關摘錄(假設ax_boost _ * M4文件都在子目錄M4):

./bootstrap

aclocal -I m4 --install 
... 

./configure.ac

... 
AC_CONFIG_MACRO_DIR([m4]) 
... 
AX_BOOST_BASE([1.48],, [AC_MSG_ERROR([libfoo needs Boost, but it was not found in your system])]) 
AX_BOOST_SYSTEM 
AX_BOOST_FILESYSTEM 
... 

./Makefile.am

ACLOCAL_AMFLAGS = -I m4 
EXTRA_DIST = bootstrap ... 
SUBDIRS = ... src ... 
... 

./src/Makefile.am

AM_CPPFLAGS = \ 
    ... \ 
    $(BOOST_CPPFLAGS) \ 
    ... 

... 

AM_LDFLAGS = ... \ 
    $(BOOST_LDFLAGS) 

... 

lib_LTLIBRARIES = libFoo.la 

... 

libFoo_la_LIBADD = \ 
    ... \ 
    $(BOOST_FILESYSTEM_LIB) \ 
    $(BOOST_SYSTEM_LIB) \ 
    ... 
+0

謝謝,我剛纔在AC_MSG_ERROR'需要升壓時遇到了問題,但它',刪除逗號解決了它。 – aberaud

+0

然後你沒有正確引用它('['和']'字符)。 – DanielKO

相關問題