2011-04-13 53 views
2

我有一些編譯和運行的c代碼,可以從許多不同的unix計算機(各種linux和mac,偶爾是其他計算機)訪問的目錄中,而不同的操作系統顯然需要不同的可執行文件。如何判斷是否爲當前機器編譯了可執行文件?

我有一個簡單的shell腳本調用相應的可執行文件prog.$OSTYPE.$MACHTYPE,如果需要的話,先編譯它。這非常簡單(儘管它需要使用csh才能確定$OSTYPE$MACHTYPE的可靠定義),並且它幾乎可行。

然而,事實證明,甚至$OSTYPE$MACHTYPE是不夠的:例如,編譯在OSX 10.5產生一個可執行prog.darwin.i386其中,在OSX 10.4當被調用時,立即崩潰。

是的,每次我想運行該程序時重新編譯是解決此問題的一種方法,但似乎過多。我知道在每臺機器上都有一個bin目錄是標準解決方案,但非root用戶可能在其主目錄之外沒有太多的寫入權限(這對所有機器都是通用的)。

所以我的問題是,有沒有更好的方法?編譯器(通常是gcc)顯然知道它編譯的是什麼類型的系統 - 是否有一種很好的可移植的方法來找出我的腳本運行在哪種「系統」上,因此它可以調用正確的可執行文件,而不是一個有未定義的行爲?

回答

2

你可以使用gcc -v找出安裝/運行的GCC認爲是主持編譯(在bash像$(gcc -v 2>&1 | grep Target: | sed 's/.*: *//')

編輯目標弓

如果你真的想在沒有特別安裝的情況下做到這一點,你可以從gcc中提取config.guess腳本(它位於任何gc的頂級目錄中c源碼包)並運行它。不幸的是,這不適用於所有系統,可能與系統gcc軟件包用於某些發行版的內容不完全一致,但這是用於配置gcc以用於構建的腳本,除非您明確地覆蓋該腳本...

+0

如果gcc不存在,'bash --version'同樣會告訴你編譯的目標bash是什麼(並且bash通常在所有系統上存在並正確編譯)。 (這可能與gcc的目標不同) – Matt 2011-04-18 01:18:19

+0

這給出了我想要的信息,但如果它不依賴於gcc,它會更好(儘管這些天可能一切都有gcc)。即使在沒有編譯器的機器上(不要大笑,它是Mac上的可選安裝),對於我的腳本來說,看到另一臺具有相同體系結構的計算機已經生成了可執行文件(現在可以使用)這是你在這種情況下所能達到的最好結果 - 每次都比重新編譯更強大)。 – Matt 2011-04-18 01:34:55

2

嘗試使用file命令從shell提示符

+0

這非常適合查看編譯的系統可執行文件。 – Matt 2011-04-18 01:19:51

+0

但它並不能說明目前的系統是什麼。即使在/ bin中查詢可執行文件也沒有幫助,因爲它們很胖(然後「文件」列出了多種體系結構,並且您必須猜測它們是什麼)。 – Matt 2011-04-18 01:27:55

0

下載一些打開使用C語言編寫的源代碼包,並查看文件./configure,該文件基本上是一個大型的shell腳本,通常通過編譯和運行短C程序來收集來自多個源的信息。這會告訴你你需要知道的一切。

由於您正在處理最近的Mac OS X,請確保您選擇當前正在維護並支持OS X版本的軟件包。

相關問題