2009-09-09 196 views
13

我已經從他們的主頁「www.boost.org」下載了「boost」(1.40.0)源代碼。 我安裝了Linux(Ubuntu 9.04 Jaunty),並試圖從我的「LINUX」機器上將boost庫編譯爲「WINDOWS」版本(例如「.dll」,而不是「.so」)。升壓 - 交叉編譯 - 「從Linux」「到Windows」

現在一個重要的問題:

是有可能編譯到「Windows」 Boost庫從「LINUX」(如果有人說「是」我會相信他,只有當他已經做到了之前會寫在這裏的解決方案,這將爲我工作。對不起,悲觀主義,但我想這樣做約3天,迄今沒有任何積極的)

到目前爲止,我已經用這種方法編譯了C++程序。 編譯從Linux到Linux我已經使用了「gcc」(或「g ++」)編譯器。 對於從Linux編譯到Windows,我使用了「i586-mingw32msvc-gcc」(或「i568-mingw32msvc-g ++」)編譯器(例如,包含在「mingw32」包中的「Ubuntu」)。

所以這個策略我一直想還使用編譯Boost庫,到目前爲止,我已經試過這(閱讀升壓主頁上的「入門」後篇):

--1。我已經運行「root」boost源代碼目錄中的「bootstrap.sh」:

./bootstrap.sh 

--2。然後我在文件「project-config.jam」(從「使用gcc;」)中更改了一件事:

using gcc : : i586-mingw32msvc-gcc ; 

--3。最後運行「的bjam」可執行文件:

./bjam stage 

但是,而不是創造的Boost庫中的「Windows版」我得到了很多錯誤消息。

任何人都可以幫助我嗎?

在此先感謝。

Petike

+4

好的,我會咬:爲什麼你要這樣做呢?爲什麼不爲Windows上的Windows編譯boost? – sbi 2009-09-09 12:20:32

+13

@sbi,爲什麼不呢?如果Windows不可用,該怎麼辦?如果你買不起呢?如果您需要從單一平臺爲不同平臺編譯的便利性。 – 2009-11-06 15:49:26

回答

0

加速讓你的操作系統和基於當前系統上當前構建的假設。如果你想獲取win32頭文件,從包含路徑中刪除所有的linux頭文件,然後嘗試構建?

0

這不是一個真正的答案,但:不!

交叉編譯到一個完全不同的平臺通常是****中的巨大痛苦。

如果您嘗試在同一臺計算機上構建Windows二進制文件(例如打包),請使用帶有窗口,mingw和相應腳本的虛擬機。

然後,你甚至可以在你的構建上運行vm等自動化測試,這應該是一個巨大的優勢。

+3

這是不可接受的 – 2009-11-06 15:51:28

+3

好吧,它的工作原理。 「可接受」還是不可以。 – AndreasT 2009-11-08 22:28:17

+2

關於能夠運行自動化測試的好處,這是在交叉編譯環境中無法完成的。 – Malvineous 2010-11-08 03:25:57

10

官方文檔對cross compilation有一個部分。比較與你在做什麼,有兩個問題:

  1. 您指定i586的-mingw32msvc-gcc和應指定i586的-mingw32msvc-G ++。前者是一個C編譯器,這是一個有點棘手,用於編譯C++代碼庫;-)

  2. 需要目標OS =窗口

注意,有一個已知的bug存在 - 當創建靜態的庫,它們不通過ranlib傳遞,並且mingw鏈接器對此非常不滿。如果您打算使用靜態庫,則必須手動運行ranlib。

+0

我嘗試過使用「i586-mingw32msvc-g ++」和「target-os = windows」,但是沒有任何東西被構建,我得到了接下來的20行錯誤。 看來我將不得不從「Windows」(或其他解決方案?)構建庫。 – Petike 2009-09-10 16:07:09

+1

讓我試着確定我做得更準確。我有SVN HEAD或Boost,並且在我的user-config.jam中有這個: 「using gcc:m:i586-mingw32msvc-g ++;」。然後我運行:「bjam toolset = gcc -m target-os = windows variant = debug --with-program_options」。我看到命令運行,最終創建了stage/lib/libboost_program_options.lib。你可以嘗試做到完全一樣嗎?如果有效,請提供您在使用中遇到的錯誤。如果它不起作用,那麼還會提供錯誤。我想如果錯誤不適合,所以使用http://codepad.org – 2009-09-13 06:55:11

+3

它終於爲我工作。 我錯了,我只試圖編譯「線程」庫而不是「全部」。線程無法編譯,因爲它找不到「pthreads」。我只添加了: 「threadapi = win32」,之後就可以了。 所以整個命令是: 「./bjam --layout = system variant =釋放線程=多鏈接=共享運行時鏈接=共享工具集= gcc target-os = windows threadapi = win32 stage」。 但我還是不能編譯這些庫: - 圖 -graph_parallel -iostreams -math(部分) -python 其他人可以編譯。 – Petike 2009-09-17 14:56:57

3

有一個非常簡單的過程遵循從linux交叉編譯的推動這裏的窗戶:

https://web.archive.org/web/20110604002004/http://www.vle-project.org/wiki/Cross_compilation_Win32

+0

非常好,這仍然在工作(至少它沒有錯誤,沒有試圖運行它)! – Luminger 2012-04-26 20:41:11

+0

+1它也適用於我! – 2013-05-14 11:51:56

+2

這似乎適用於我,在Ubuntu 12.04上反對boost 1.48.0。 Elthariel,如果你的答案擴大到包含該鏈接的內容,以防鏈接過時,那麼這可能是一個好主意。如果你這樣做,我會鼓勵你。 – 2014-06-20 18:11:17

2

這是我使用的命令。我已經測試了它們以提升1.46和1.49。

首先,創建指向/ usr/i686-w64-mingw32/bin中編譯器的鏈接。你可以運行這個腳本:

#!/bin/bash 

binDir="/usr/bin" 
destDir="/usr/i686-w64-mingw32/bin" 

cd "$binDir" 
mkdir -p "$destDir" 

for name in $(ls i686-w64-mingw32*); do 
    newName=$(echo "$name" | sed 's/i686-w64-mingw32-//g') 
    if [ -f "$destDir/$newName" ]; then 
     rm "$destDir/$newName" 
    fi 
    ln -s "$binDir/$name" "$destDir/$newName" 
done 

然後,安裝bjam。在Ubuntu/Debian的,它包含在一攬子 「libboost1.48-dev的」

apt-get install libboost1.48-dev 

要完成,root用戶,運行

env PATH=/usr/i686-w64-mingw32/bin:$PATH bjam toolset=gcc target-os=windows variant=release threading=multi threadapi=win32 link=static --prefix=/usr/i686-w64-mingw32 -j 4 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install 

完成!

+0

我意識到自你的答案已經兩年了,但是:你說的這個'autoRegex'是什麼?爲什麼不「sed'/ i686-w64-mingw32 - // g'」? – 2014-06-20 03:52:12

+0

這是一個在我的電腦中出現的腳本,它只是一個sed。根據你的建議我修改了我的答案。 – Congelli501 2014-06-20 08:29:12

+0

我收到以下錯誤:無效屬性' win32':未知功能'threadapi'。 Boost庫雖然有點新版本。 – 2015-02-06 15:42:29