2014-01-21 28 views
1

我知道在Unix類型的系統上有(至少)兩種完全不同的共享庫文件。一個是在Mac OS X上使用GNU/Linux系統,可能其他系統中使用,以及(與文件名中的「所以」結尾)的種類和其他的,也可能其他系統以及(與文件名結尾在「.dylib」中)。如何判斷當前的操作系統是否使用類似Linux的或MacOSX共享庫?

我的問題是這樣的---有我可以從一個shell腳本,將很容易地檢測當前操作系統使用共享庫這兩種模式的做任何類型的測試?

我相信我能找到一些方法可以輕鬆地與這種差異處理---如果只有我知道一個簡單的測試,我可以從一個shell腳本運行會告訴我哪個共享庫的類型上使用的目前的系統。

+2

你可以用'UNAME -a'輸出開始或'/等內容/ issue'。另外,請記住,OS X(或多或少)BSD,而不是Linux,因此即使您鏈接到正確的庫,如果您只是從一個系統到另一個系統進行叉車,您也不會具有二進制兼容性。 – DopeGhoti

+0

識別系統不是問題---問題是知道系統使用什麼類型的共享庫。我可以按照你的建議去做「uname -a」,或者通過運行GNU的「config-guess」腳本來獲得一個更加可配置的系統ID碼(我不能看「/ etc/issue」'coz這在我的系統中是不存在的) - 但除非有一種方便的方法來根據系統的標識查找庫格式,否則我仍然處於第一位。 –

+0

@shellter FreeBSD的(和其他BSD變種,我想)對BSD內核之上自己的Linux兼容層,其允許運行未經修改的Linux(ELF)二進制文件。曾幾何時,他們擁有DOOM和Java的方式:)除維基百科以外,Linux還可以運行MacOS X 10.6二進制文件。所以問題是什麼user3080003想:) – user3159253

回答

1

好吧,我想你需要檢查可執行文件類型的目標平臺上。您可以使用file(檢查其輸出,例如/bin/ls)。 ELF是在Linux上使用最廣泛的可執行文件類型,而Mach-O是「原生地」在MacOS X上使用

的注意事項:從技術上說是在這些系統上其他可執行的類型,說a.outPEF,而且,你猜,這些格式都有自己的動態庫。坦白地說Linux有可執行文件格式的可插拔的支持,甚至Win32 .EXEs可以執行「準原生地」在Linux中(當然,他們需要的Win32 API的實現超過給定的內核API的工作,酒是這樣implemetation)。

另外如果你需要創建一個動態加載的庫,那麼你應該使用其中一個可移植構建系統(僅舉幾例:GNU autotools,CMake,QMake ...)。因此,你得到的不僅僅是普通的DLL擴展也是連接標誌,安裝/卸載的便攜式方法等等...

+0

非常感謝。 :-)當然,我有理由不使用GNU autotools,也就是說沒有其他人使用autotools編寫的知名包可以在我的android上成功構建 - 而我自己的東西沒有搭建 - - 但是你告訴我關於使用「文件」命令解決了我的問題。 :-)我寫了一個分析「文件」輸出的命令,現在一切正常。 :-) 謝謝。 :-) –

相關問題