2015-06-07 54 views
2

Linux下交叉編譯適用於Mac的是PITA。要設置交叉編譯,您需要一個Apple開發人員帳戶,來自XCode的SDK等。我嘗試過但無法使其工作。看來所有可用的指令都是過時的。交叉編譯適用於Mac的Linux上的簡單標準C程序

但我想編譯的程序只是一個小型的shell工具,只需要一個標準的C庫(最好是靜態鏈接的glibc)。不需要Mac框架或Objective-C。可以很容易地編寫這樣一個二進制的Windows,沒有那麼多的OS X.這似乎像所有的,缺少的只是鏈接部分,因爲你可以建立的Mach-O目標文件這樣的:

clang -target i386-apple-darwin-macho hello_world.c -o hello_world.o -c 

但當然這不是那麼簡單,因爲這會產生一個錯誤:

echo $'#ifdef __linux__\n#error "thinks it\'s for linux"\n#endif'| \ 
    clang -x c - -o /dev/null -c 

有什麼辦法來編譯爲Mac OS X的Mach-O對象與Linux下未打補丁鐺?那麼有沒有辦法將這樣一個目標文件與Mac的靜態glibc鏈接起來,因此它可以在OS X下運行?我在哪裏可以得到這樣一個glibc(我想我必須自己編譯它)?

回答

1

OSXCross項目可能是你在找什麼。

Is there any way to compile a mach-o object for Mac OS X with an unpatched clang under Linux?

是的。 Clang默認是交叉編譯器。但是,您還需要cctools/ld64和Mac OS X SDK。

Is there then a way to link such an object file with a static glibc for Mac so it runs under OS X?

沒有的glibc的Mac OS X,它簡單地稱爲Libc那裏。無需靜態鏈接。

And where would I get such an glibc (I guess I have to compile it myself somehow)?

您需要獲得Mac OS X SDK,但是沒有辦法繞過它。即使你設法手動建立Libc,那麼你仍然缺少很多必需的庫。


I know that Mac OS X doesn't ship glibc.

沒有爲Mac OS X的

... but I write my code against that. E.g. I use PRIuPTR (%zu) etc., does Mac's libc support that?

是沒有的glibc。 AFAIK %zu printf說明符可以在Windows以外的任何地方使用。

That's what I feared. Last time I tried that it was very cumbersome and I couldn't get it to work.

獲取免費的蘋果開發者賬戶,然後就可以通過https://developer.apple.com/downloads/index.action下載Xcode的。

一旦你用下面的SDK包裝說明進行操作來完成。

What libraries? A libc should only need to make syscalls and not use other libraries.

$ otool -L /usr/lib/libc.dylib  
libc.dylib (architecture x86_64): 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 
     /usr/lib/system/libcache.dylib (compatibility version 1.0.0, current version 69.0.0) 
     /usr/lib/system/libcommonCrypto.dylib (compatibility version 1.0.0, current version 60061.0.0) 
     /usr/lib/system/libcompiler_rt.dylib (compatibility version 1.0.0, current version 35.0.0) 
     /usr/lib/system/libcopyfile.dylib (compatibility version 1.0.0, current version 1.0.0) 
     /usr/lib/system/libcorecrypto.dylib (compatibility version 1.0.0, current version 233.1.2) 
     /usr/lib/system/libdispatch.dylib (compatibility version 1.0.0, current version 442.1.4) 
     /usr/lib/system/libdyld.dylib (compatibility version 1.0.0, current version 353.2.1) 
     /usr/lib/system/libkeymgr.dylib (compatibility version 1.0.0, current version 28.0.0) 
     /usr/lib/system/liblaunch.dylib (compatibility version 1.0.0, current version 559.20.9) 
     /usr/lib/system/libmacho.dylib (compatibility version 1.0.0, current version 862.0.0) 
[And so on...] 

如果我可以給你一個很好的建議,甚至沒有嘗試手工打造Libc。這是(幾乎)不可能的。 上次我嘗試了很多標題,但我甚至找不到通過opensource.apple.com。

這只是浪費時間。

而C庫是目前爲止不是所有你需要的OS X, 很多庫的依賴(閉源)框架,的libC++,...

+0

我知道的Mac OS X不船glibc,但我寫我的代碼反對。例如。我使用PRIuPTR(%zu)等,Mac的libc是否支持? 「你需要獲得Mac OS X SDK,這是沒有辦法的。」這就是我所害怕的。上次我嘗試過這是非常麻煩的,我無法讓它工作。 「即使你設法手動構建Libc,你仍然缺少很多必需的庫。」什麼庫? libc只需要進行系統調用而不使用其他庫。 – panzi

+0

@panzi:更新了我的答案。 – Thomas

+0

這是意想不到的,因爲在Linux下它是: '$ ldd/lib64/libc.so.6↵/lib64/ld-linux-x86-64.so.2(0x0000003cf9600000)↵linux-vdso.so.1 => (0x00007fff14f52000)' 而且這已經超出了我的預期(不過yum說ld-linux-x86-64.so.2是glibc包的一部分)。 無論如何,這對我來說似乎太複雜了,只是爲了一個小小的shell程序。我可能應該用Python編寫它,並且使用非Linux的py2exe/py2dmg(或者它叫做什麼)。 – panzi