2009-09-09 127 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