Boost-Build:从Linux构建Windows可执行文件

3
我有一个 C++ 代码库,需要构建 Windows 和 Unix 版本。重要的是,Windows 可执行文件可以在没有安装 Cygwin 或类似软件的情况下运行。哦,我正在尝试从 Ubuntu 实现这一目标。
我一直在努力想弄清如何让 Boost-Build 处理它,但到目前为止还没有成功。为简单起见,假设这是项目结构:
root/
|- src/
|  |- core/
|  |  |- number.cpp
|  |  |- number.hpp
|  |- main.cpp
|- jamroot

为了让boost-build首先生成Windows二进制文件,我在我的主目录下创建了一个名为user-config.jam的文件,并包含以下内容:
using gcc : 4.4 : i586-mingw32msvc-g++ : <rc>i586-mingw32msvc-windres <archiver>i586-mingw32msvc-ar ;

我的 jamroot 文件长这样:
exe hello :
    [ glob-tree *.cpp ]
    : : <target-os>windows
;

但当我运行 bjam 后,我得到的是一个 Unix 可执行文件(没有扩展名),而不是 Windows 可执行文件。将应用程序重命名为 .exe 扩展名并在 Windows 上运行也不起作用。我尝试了各种 bjam 选项,如 bjam --toolset=gcc --target-os=windowsbjam --toolset=gcc-mingw --target-os=windows 等等,但似乎都不起作用。
值得一提的是,mingw 已经正确安装并工作正常。手动调用编译器可以产生正确的输出文件。
有什么想法吗?
另外,我怎样才能让 bjam 构建我在 user-config.jam 文件中列出的每个工具集的版本?
额外问题: 最终,我需要链接一个 boost 库和一个自定义预构建库。我该如何为不同的目标系统指定不同的库?

更新 我从http://mingw-cross-env.nongnu.org/下载了脚本,可以让我一次编译mingw和boost库,所以这个问题已经解决了。我找到了一种方法来让bjam调用mingw编译器(我现在在另一台电脑上,无法提供解决方案)。其他问题仍未解决。


你在 Linux 系统中安装了 MinGW 吗?此外,可以参考这里:http://www.mingw.org/wiki/LinuxCrossMinGW - yasouser
是的,如问题所述,mingw已安装并正常工作。手动调用mingw编译器可以正确生成Windows可执行文件。 - Morten Jacobsen
3个回答

1

很遗憾,我认为这是做不到的(我已经失败了很多次),原因是mingw不支持编译Boost。人们似乎唯一的方法是在win32下使用MS Visual Studio维护一个单独的构建环境。

从你的问题中不清楚你是否正在使用bjam来构建应用程序,或者你只是尝试构建Windows版本的Boost库(.lib或.dll文件)以便稍后与应用程序链接。在我的尝试中,我试图按照“通常”的方式进行操作,即编译Boost的Windows版本库,然后使用mingw32分别编译应用程序并与Boost链接。

不幸的是,到目前为止,我的障碍只有两种结果 - 要么在将Boost编译为Win32动态库(.dll)时构建失败,要么成功构建win32静态库,但libtool拒绝将它们与应用程序链接

看一下 Arch Linux 使用来编译 mingw32-boost 的 PKGBUILD 文件,你可能会从中获得一些提示。似乎 bjam threadapi=win32 target-os=windows 就足够了。但别忘了正确设置前缀,这样你就不会用 win32 版本覆盖本地库了!


我正在尝试编译boost库以及依赖于boost::program_options的我的应用程序。不幸的是,我的应用程序依赖于另一个无法使用MSVC构建的库,这意味着我被迫使用mingw。 - Morten Jacobsen
@Morten Jacobsen:你仍然可以使用mingw编译自己的程序,但据我所知,如果你想要.dll文件,你必须使用MSVC来编译Boost库。你可以使用mingw构建静态Boost库,但是我不确定你应该如何将应用程序与它们链接起来。我不熟悉使用bjam编译自定义应用程序,因为我一直在使用GNU autotools进行编译。 - Malvineous

0

在我的Ubuntu电脑上,这很简单

sudo apt-get install mingw

然后构建

export CC=i586-mingw32msvc-gcc
make 

利润!


很遗憾,这并不是很有帮助。不知何故,没有删除按钮。或许以后会有吧。 - sehe

0
我知道这是老问题了,但是既然我在寻找答案的时候偶然发现了这个帖子,我就在这里留下答案。
所以我需要在Ubuntu上使用mingw编译Boost::Asio项目的Windows版本。
首先,我构建了一个在Linux上运行良好的版本。然后,我尝试包含一个针对我所针对的Windows版本的工具链文件。完成设置后,我遇到了这种错误:
我不得不下载Windows版的Boost库,并在我的CMakeLists.txt中进行设置。 之后,我遇到了一个新的错误:
我不得不在CMakeLists.txt和exe.cpp中添加一行代码,在add_executable之后,我需要指定"target_link_libraries(executable_name ws2_32)",并在exe.cpp中添加"#pragma comment(lib, "Ws2_32.lib")"。

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