2015-09-02 202 views
2

在構建C++項目時,我們有多個目標: 32位和64位。交叉編譯:檢查是否可以在64位機器上構建32位

在某些64臺的機器,同時建立32位的目標,我們已經看到了失敗,因爲G ++ - multilib的丟失:

/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory 

我的問題是這樣的:

什麼是最好的方式根據安裝的編譯器和glibc軟件包查詢當前機器是否能夠生成32位圖像。

一個解決方案可能是,例如, 生成一個簡單的C文件,其中包含多個glibc包含並查看我是否能夠編譯模擬文件。

這似乎並不是優雅的解決方案。

取而代之,我想查詢機器以查看是否安裝了所有nesscary軟件包。

P.S:

我們使用WAF作爲構建基礎結構。

感謝,

伊泰

+0

也許[這個](http://serverfault.com/questions/54736/how-to-check-if-a-library-is-installed)會有幫助嗎? – Glapa

回答

0

它可能會幫助,

嘗試到你的機器這是GNU C語言庫上安裝的libc6-DEV-I386:爲AMD64 32位開發庫。

0

您想查詢機器是否安裝了所有必需的32個軟件包...

rpm -qa --queryformat 'libc6-dev-%{ARCH}\n' | grep 'i[6543]86' | cut -d' ' -f1 
5

檢查給定包的存在通常是一個好主意,因爲它依賴於特定的發行版(例如Fedora)和特定的軟件包名稱(例如libc6-dev-i386);其他發行版(或相同發行版的其他版本)將具有不同的軟件包名稱和工具來與軟件包管理器進行交互(例如apt vs rpm vs ...)

成熟的autotools方法是運行測試(例如,包含給定的頭文件),而不是檢查可能提供您需要的東西(例如某個包)的東西 -

eg如果您的實際代碼需要包含features.h,那麼您應該測試(在預構建步驟中)是否可以包含此文件而沒有錯誤。

如果不能使用features.h,以下autotools示例將停止並顯示錯誤;它允許用戶在開始耗時的構建過程之前通過安裝正確的軟件包(例如在README中暗示)來解決問題。

#snippet from configure.ac 
#stop configure process if we cannot use foo.h 
AC_CHECK_HEADERS([foo.h],,AC_ERROR([cannot include foo.h - try installing libfoo-dev]) 

如果不是失敗的配置步驟中,您寧願簡單地禁用您構建的部分,你可能想要做這樣的事情:

configure.ac:

have_bar_h="no" 
AC_CHECK_HEADERS([bar.h],[have_bar_h="yes"]) 
AM_CONDITIONAL([BAR]) [ test "x${have_bar_h}" = "yes" ] 

和Makefile .am

if BAR 
# only do the 32bit build if we have bar.h 
bin_PROGRAMS+=coolapp32 
ebduf 

對不起,這個答案是非常autotools具體的,但我敢肯定,waf有類似的方法;查看WAF文檔中有關Configuration helpers的部分。

+2

事實上,在waf中進行這種檢查相當容易:https://waf.io/book/#_configuration_helpers – haraldkl

+0

@haraldkl thx,在答案中指出。 –

相關問題