Boost - 跨平台编译 - “从Linux”到“Windows”

13
我从"www.boost.org"下载了"boost"(1.40.0)源代码。我已经在安装了Linux (Ubuntu 9.04 Jaunty)的机器上尝试编译boost库到"WINDOWS"版本 (例如".dll", 而不是".so")。
现在有一个很重要的问题:
能否从"LINUX"上编译出"WINDOWS"版本的BOOST库呢?(如果有人回答“可以”,我只会相信他已经做过或者会在这里写一个对我有效的解决方案。抱歉,我这么悲观是因为我已经尝试了3天,目前没有任何进展)
迄今为止,我已经使用以下方法编译C++程序:
- 对于从Linux到Linux的编译,我使用了"gcc"(或"g++")编译器。 - 对于从Linux到Windows的编译,我使用了"i586-mingw32msvc-gcc"(或"i568-mingw32msvc-g++")编译器(例如,在Ubuntu中包含在"mingw32"软件包中)。
这个策略我也想用来编译boost库,根据boost主页上的"入门指南",我尝试了以下步骤:
- 我从"root" boost源代码目录下运行了"bootstrap.sh"脚本:
./bootstrap.sh

--2.然后我在文件"project-config.jam"中更改了一个内容(从"using gcc ;"):

using gcc : : i586-mingw32msvc-gcc ;

--3. 最后运行 "bjam" 可执行文件:

./bjam stage

我想创建boost库的"Windows"版本,但是却遇到了很多错误信息。

有人可以帮忙吗?

先感谢一下。

Petike


4
好的,我来翻译:好吧,我会说服你:你为什么想这样做呢?为什么不在Windows上编译boost呢? - sbi
14
@sbi,为什么不呢?如果Windows不可用怎么办?如果你负担不起它怎么办?如果你需要在一个平台上为不同的平台进行编译,那方便性呢? - Matt Joiner
5个回答

10
官方文档有一节关于交叉编译。将其与您所做的内容进行比较,存在两个问题:
  1. 您指定了i586-mingw32msvc-gcc,应该指定i586-mingw32msvc-g++。前者是C编译器,使用它来编译C++代码库有点棘手 ;-)

  2. 您需要target-os=windows

请注意,那里有一个已知的错误--在创建静态库时,它们不会通过ranlib传递,mingw链接器对此特别不满意。如果您打算使用静态库,您需要手动运行ranlib。


我尝试使用"i586-mingw32msvc-g++"和"target-os=windows",但是没有构建成功,我得到了接下来的20行错误信息。 看起来我需要从"Windows"构建库(或者另外找一个解决方案?)。 - Petike
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。你能否尝试完全相同的操作?如果可以,请提供您在使用过程中遇到的错误。如果不起作用,则也提供错误信息。我想错误信息可能无法适应SO,因此请使用http://codepad.org。 - Vladimir Prus
3
对我来说它最终可行了。 我错了, 我只尝试编译了 "thread" 库而不是 "all"。而且线程无法编译,因为它找不到 "pthreads"。我只添加了: "threadapi=win32" 然后就可以了。 所以整个命令是: "./bjam --layout=system variant=release threading=multi link=shared runtime-link=shared toolset=gcc target-os=windows threadapi=win32 stage"。但我仍然无法编译这些库: -graph -graph_parallel -iostreams -math (部分) -python其他的可以被编译。 - Petike
你需要所有这些其他库吗?如果不需要,可以使用--without-xxx来禁用它们的构建。我认为除了数学库之外,所有其他库都需要额外的第三方组件,只有在必要时才应该安装它们。 - Vladimir Prus

3

非常好,它仍然可以工作(至少能够编译通过,尚未尝试运行)! - Luminger
2
这对我来说似乎有效,针对Ubuntu 12.04上的boost 1.48.0。Elthariel,你最好将那个链接的内容包含在你的答案中,以防链接失效。如果你这样做,我会给你点赞。 - Cognitive Hazard
2
链接失效了,该怎么办? - Chris

2
这是我使用的命令。我已经测试过它们适用于boost 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

完成!


我知道你的回答已经两年了,但是:你所说的“autoRegex”是什么?为什么不用“sed 's/i686-w64-mingw32-//g'”呢? - Cognitive Hazard
这是我电脑上的一个脚本,只是执行了一个sed命令。根据您的建议,我修改了我的回答。 - Congelli501
我遇到了以下错误:无效属性'<threadapi>win32':未知特性'threadapi'。尽管Boost库是较新的版本。 - Seppo Enarvi

0
Boost基于您当前的系统对操作系统和当前构建进行假设。如果您获得了win32头文件,并从包含路径中删除所有Linux头文件,然后尝试构建会怎样呢?

-1

这并不是一个真正的答案,但是:不要这样做!

交叉编译到完全不同的平台通常是非常麻烦的。

如果您正在尝试在同一台机器上构建Windows二进制文件,比如用于打包,请使用带有Windows、Mingw和适当脚本的虚拟机。

然后,您甚至可以在虚拟机上运行自动化测试等等,这应该是一个巨大的优势。


2
能够运行自动化测试是一个很好的观点,这是在交叉编译环境中无法完成的。 - Malvineous
给那些点踩的人:你们能否具体说明一下我说的哪些话有问题?请注意“这不是真正的答案”的前言。 - AndreasT
我没有点踩,但是Stack Overflow非常注重问题和答案。如果不是一个答案,或者有人说问题是错误的(就像你的帖子所暗示的那样),那么你会得到负分。这是因为很多人从Google上寻求特定问题的帮助,而阅读“不要这样做”对于那些有截止日期或其他要求而无法选择的人并没有帮助。特别是在这种情况下,你正在建议人们购买Windows许可证而不是免费解决问题。你最好将其作为评论发布在问题上。 - Malvineous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接