2017-06-01 112 views
13

是否可以從OS X計算機編譯swift二進制文件,使其在運行Linux的服務器上作爲單個二進制文件運行,而不需要額外的庫需要動態鏈接?快速交叉編譯爲單個linux二進制

我在想像傳遞一個-target到swift命令並傳遞另一個參數讓它靜態鏈接所有的依賴關係,但我不知道確切的命令是什麼。

-target的確切值似乎相當難以捉摸。

我是否需要知道確切的目標分佈才能將正確的字符串傳遞給-target參數?

+0

也許我誤解了你的問題,但是linux二進制(elf)和mac二進制(mach-o)[不兼容](https://stackoverflow.com/questions/9439436/is-a-linux-executable-兼容-與-OS-X)。 – TheDarkKnight

+0

是的,顯然他們不是。交叉編譯意味着從一個os編譯到不同的目標os。例如,工作形式爲一個linux盒子,並編譯爲一個Windows兼容的exe。我以前沒做過,但我看到有人談論做這種事情,所以我認爲這是可能的。 – hasen

+0

我並不認爲這在OS X上與本機Apple編譯器是可能的,但會感興趣地觀看這個問題。 – TheDarkKnight

回答

11

從閱讀github

  • 目標的來源將是Linux的
  • 機將x86_64的

這得到由初級build script

叫這怎麼過答案的一部分的問題

-target的確切值似乎相當難以捉摸。

爲Mac OSX安裝GCC工具鏈,可以重定向Linux,我可以看到的一個回購是OSXCross

在運行引用該工具鏈的腳本之前,將值提供給GCC的環境變量。

不幸的是,這並不能保證它能正常工作,但試試看看會發生什麼。

+0

謝謝OP。 :) – t0mm13b

1

是否可以從OS X計算機上編譯swift二進制文件,以便它可以在運行Linux的服務器上作爲單個二進制文件運行,而不需要額外的庫需要動態鏈接?

簡短的回答?當然如此!任何事情都是可能的,當你放下心扉時!

效率高嗎?本質上,沒有。

雖然我相信在座的各位是熟悉的編譯器做什麼,對這個問題的目的和其最新的用戶,編譯器是一種將人類可讀的代碼,並將其映射到一個二進制格式的應用一臺電腦可以理解。但值得一提的是,並非所有的計算機都是一樣的。每個計算機操作系統都有不同的二進制映射,因此像複製值這樣的簡單操作可以在一臺機器上表示爲1010,在另一臺機器上表示爲0101。正如在許多問題事先如前所述,and for example this one,很多編程語言都可建在各種機器,但他們很少有碰到他們便攜式因爲每臺計算機都有一個不同的二進制映射。

~~~~~~~ 那麼我們如何解決這個問題呢? ~~~~~~~

  • 那麼有解決這個問題的一些解決方案。最明顯的方法是簡單地讓你的環境成爲目標環境,並且 建立你的程序給你的內心。你很明顯已經通過虛擬機做了這個 ,這通常是許多開發者會做的事情。這是迄今爲止最簡單的解決方案,但它打破了您希望從OSX機器簡單構建 的問題的目的。

早些時候你說過你曾經聽過有人談論過在Linux機器上編譯windows程序。 Cygwin是一個開發平臺,旨在獲得通常不在linux機器上的windows框架,並允許用windows框架構建許多程序。然而,它所做的只是添加二進制文件,以便在配置中找到僅限windows命令時,編譯器具有一些適當的映射位置。它所做的全部工作都是介紹程序成功移植所需的二進制配置。這關係到第二個選項。

  • 其次是支持跨平臺編譯的編譯器。 雖然我目前並不瞭解和/或不熟悉這樣的 編譯器,但這在技術上是一個有效的解決方案,但是我會將它稱爲 可靠嗎?可能不會。如果你只是增加了更多的工作到 你的編譯器不僅需要正確映射一臺計算機的一個計算機程序的語法,它必須浪費時間將 鏈接到新的二進制文件。此外,您需要讓編譯器記住這些鏈接,這可能會導致浪費更多的內存空間來獲得此編譯器。

即使這樣,像這樣的系統是寥寥可數,以及是否其保證的工作依賴於編譯器的維護者如何知道自己的東西,怎麼他們經常更新等等,等等,他們甚至執行的機會首先解決二進制文件的映射並不是我想要的。

  • 第三個也許是最理想的解決方案是查看容器技術,如docker。它們的容器實質上是構建應用程序並將其移植到新機器的方式,無需更改或修改任何關於如何構建和編譯它的任何內容。只需構建一個,將其存儲在容器中,將其移植到您選擇的機器並將其集成到當前項目中。想想看,像docker這樣的容器系統是爲了防止你當前正在經歷的事情,你的源代碼在你的一臺機器上工作,但沒有其他地方。像docker這樣的東西將能夠在任何機器上運行你的代碼,而不必爲每臺新機器重新編譯它。

泊塢窗提供容器容器通信,應用實例一個有趣的框架,並有一個相當簡單的文檔,這將是值得期待的,看看你的項目可能有它的一些部件移植到泊塢窗。

這就是說,有多種方法可以解決您當前面臨的問題,因此當您成爲一名軟件工程師時,您將以何種方式處理您的項目是最理想的方式。

// //編輯

將編輯這是一個更好的響應一次,林不落累得要死。

+0

Cygwin不適用於Windows上的Windows應用程序,它適用於Windows上的Linux應用程序(btw感謝鏈接,所以我不必使用Google;)) – Markaos

+0

此外,服務器可能不使用Swift的部分, t在Linux上可用(像GUI庫,我猜),所以它應該是有效的 – Markaos

+0

@Markaos我知道它不是什麼cygwin的。我指的是這樣一個事實,即它添加了您從編碼的角度來看需要的二進制文件,您無法在其他地方接收這些二進制文件。如果你是一個在linux上工作的C++編碼器,並且你希望你的應用在windows上運行,那麼你需要一些二進制包,Windows和Linux都沒有。我在cygwin的印象下解決了這個問題。我所指的效率就是在內存,時間和複雜性方面做出原始問題所需的解決方法。 – Jouster500