【问题标题】:Boost - cross compile - "from Linux" "to Windows"Boost - 交叉编译 - “从 Linux” “到 Windows”
【发布时间】:2009-09-09 11:58:31
【问题描述】:

我从他们的主页“www.boost.org”下载了“boost”(1.40.0)源代码。 我安装了 Linux (Ubuntu 9.04 Jaunty) 并尝试从我的“LINUX”机器将 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 主页上的“入门”文章之后):

--1。我已经从“root”boost 源代码目录运行了“bootstrap.sh”:

./bootstrap.sh

--2。然后我更改了文件“project-config.jam”中的一件事(来自“使用 gcc ;”):

using gcc : : i586-mingw32msvc-gcc ;

--3。最后运行“bjam”可执行文件:

./bjam stage

但我没有创建“Windows”版本的 boost 库,而是收到了很多错误消息。

谁能帮帮我?

提前致谢。

宠物狗

【问题讨论】:

  • 好吧,我会咬人的:你到底为什么要这样做?为什么不在 Windows 上为 Windows 编译 boost?
  • @sbi,为什么不呢?如果 Windows 不可用怎么办。如果你买不起怎么办?如果您需要从单个平台为不同平台编译的便利性怎么办?

标签: c++ boost compilation


【解决方案1】:

官方文档中有一个关于cross compilation 的部分。与您正在做的事情相比,有两个问题:

  1. 您指定 i586-mingw32msvc-gcc 并应指定 i586-mingw32msvc-g++。前者是一个 C 编译器,使用它来编译 C++ 代码库有点棘手;-)

  2. 你需要 target-os=windows

请注意,这里有一个已知的错误——在创建 static 库时,它们不是通过 ranlib 传递的,而 mingw 链接器对此特别不满。如果您打算使用静态库,则必须手动运行 ranlib。

【讨论】:

  • 我用 "i586-mingw32msvc-g++" 和 "target-os=windows" 尝试过,但没有构建任何东西,我得到了接下来的 20 行错误。看来我必须从“Windows”(或其他解决方案?)构建库。
  • 让我尝试更准确地确定我所做的事情。我有 SVN HEAD 或 Boost,我的 user-config.jam 中有这个:“使用 gcc : m : i586-mingw32msvc-g++ ;”。然后我运行:“bjam toolset=gcc-m target-os=windows variant=debug --with-program_options”。我看到命令运行,最终创建了 stage/lib/libboost_program_options.lib。你能尝试做同样的事情吗?如果它有效,那么请提供您在使用时遇到的错误。如果它不起作用,则还提供错误。我想错误不适合 SO,所以使用codepad.org
  • 它终于对我有用了。我错了,我只尝试编译“线程”库而不是“全部”。并且线程无法编译,因为它找不到“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 (partly) -python 其他的可以编译。
  • 您需要所有其他库吗?如果没有,请使用 --without-xxx 禁用构建它们。我认为所有这些,除了数学,都需要额外的第三方组件,你应该只在必要时安装它们。
【解决方案2】:

这里有一个非常简单的程序可以从 linux 到 windows 交叉构建提升:

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

【讨论】:

  • 很好,这仍然有效(至少它构建没有错误,没有尝试运行它)!
  • 这似乎对我有用,反对 Ubuntu 12.04 上的 boost 1.48.0。 Elthariel,您最好扩展您的答案以包含该链接的内容,以防链接过时。如果你愿意,我会支持你。
  • 链接失效了,怎么办
【解决方案3】:

这是我使用的命令。我已经测试了它们的 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' ”?
  • 这是我电脑中的一个脚本,它只是做一个 sed。我根据你的建议修改了答案。
  • 我收到以下错误:无效属性“win32”:未知功能“threadapi”。 Boost 库是一个更新的版本。
【解决方案4】:

Boost 根据您当前的系统对您的操作系统和当前构建做出假设。如果您要获取 win32 头文件,从包含路径中删除所有 linux 头文件,然后尝试构建,该怎么办?

【讨论】:

    【解决方案5】:

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

    交叉编译到完全不同的平台通常是一个巨大的痛苦。

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

    然后您甚至可以使用您的构建在 vm 等上运行自动化测试,这应该是一个巨大的优势。

    【讨论】:

    • 能够运行自动化测试的好处是,这是在交叉编译环境中无法做到的。
    • 致反对者:您能否具体说明您认为我的陈述有什么问题?请注意“这不是真正的答案”序言。
    • 我没有投反对票,但 Stack Overflow 非常关注问题和答案。如果它不是一个答案,或者有人说这个问题是错误的(正如你的帖子所暗示的那样),那么你会得到反对票。这是因为很多人从谷歌来寻求特定问题的帮助,如果这个人有最后期限或其他要求让他们无法选择,那么阅读“不要这样做”并没有帮助。特别是在这种情况下,您说人们应该购买 Windows 许可证,而不是免费解决问题。您最好将其发布为对该问题的评论。
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2017-02-03
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2021-11-20
    相关资源
    最近更新 更多