【问题标题】:Cross-Compiling wxWidgets code from Linux to Windows从 Linux 到 Windows 交叉编译 wxWidgets 代码
【发布时间】:2018-01-14 15:15:29
【问题描述】:

我在 Debian 8.9 Jessie (x86-64) 中使用 Code::Blocks IDE 和 wxWidgets。
当我使用 GNU GCC 编译器时,一切正常,因此可以为 Linux 编译好的 wxWidgets 可执行文件。
但是我需要让我的程序在 Windows 平台上运行,所以我必须进行交叉编译。
我已经安装了 mingw32 并按照给出的交叉编译说明进行操作 here.
我的 wxWidgets 构建配置如下:

./configure prefix=/usr/i686-w64-mingw32 --host=i686-w64-mingw32 --enable-unicode --build=`./config.guess` --disable-shared

这是因为我的MinGW编译器是i686-w64-mingw32,位于文件夹/usr/i686-w64-mingw32,wxWidgets版本是3.1。 我在 Code::Blocks 中的编译器设置应该是正确的,因为我设法为简单的控制台应用程序进行了交叉编译,并且这些应用程序在 Windows 10.0 上正常运行。但是对于 wxWidgets 应用程序有几个问题:

  1. 编译器给了我错误(在项目的构建选项中将 --static 添加到 Other compiler options 时发生):

    fatal error: wx/app.h: No such file or directory|
    

    现在,由于有问题的 wx 目录位于路径 /usr/i686-w64-mingw32/include/wx-3.1 中,因此我将此路径添加到项目的搜索目录中(目前仅构建目标)。这很好地继续进行。
    我的编译器设置是:wx-config --host=i686-w64-mingw32 --static --cflags

  2. 编译器再次发誓(虽然并不惊讶:-)):

    fatal error: wx/setup.h: No such file or directory|
    

    好的,我在/usr/i686-w64-mingw32/lib/wx/include/i686-w64-mingw32-msw-unicode-static-3.1 找到了这个,所以将此路径添加到编译器搜索目录。

  3. 这次链接器在发誓(让我神经紧张):

    对于构建目标:

    undefined reference to `wxEntry(HINSTANCE__*, HINSTANCE__*, char*, int)'|
    

    对于发布目标:

    undefined reference to `wxAppConsoleBase::CheckBuildOptions(char const*, char const*)'|
    

    我的链接器设置是wx-config --host=i686-w64-mingw32 --static --libs

我尝试使用 wxWidgets 库的几种不同构建选项来解决此问题,但对结果没有影响。所以请有人帮忙!

我还注意到,从 wxWidgets 下载目录运行 ./config.guess 会得到 x86_64-unknown-linux-gnu。因此这意味着我应该使用x86_64-w64-mingw32(我在/usr/x86_64-w64-mingw32中安装了这个)编译器而不是i686-w64-mingw32

【问题讨论】:

  • 为什么要交叉编译,而不是直接在Windows上构建(用mingw?)
  • 我想您会发现拥有一台用于开发和测试目的的 Windows 机器(可能是虚拟机)要容易得多。
  • @MartinBonner 肯定会更容易,但我不想为许可证付费或做一些非法的事情:-)。
  • @Pekov,运行wx-config --host=i686-w64-mingw32 --libs的结果是什么?另外,您能否成功构建和运行最少的示例?
  • @Pekov,另外,我会尝试找一台安装了 Windows 的额外机器并尝试一下。或者只是使用全新的机器。

标签: c++ linux cross-compiling wxwidgets


【解决方案1】:

所以主要问题是Other compiler options 中无法识别命令wx-config --static --cflagsOther linker options 中无法识别wx-config --static --libs

即使我在主目录的.bashrc 文件中添加了wx-config 文件的路径,问题仍然存在,即export PATH="$PATH:/usr/i686-w64-mingw32/bin"。那时我可以在任何位置从终端运行 wx-config。

为了解决这个问题,我将Other compiler options 中的/usr/i686-w64-mingw32/bin/wx-config --static --cflagsOther linker options 中的/usr/i686-w64-mingw32/bin/wx-config --static --libs 更改为选项。这是一种魅力。

我在Link libraries 中添加了libstdc++-6.dll 的位置(只需在文件管理器中搜索即可找到),在Other linker options 中添加标志-static-static-libgcc,最后使用Igor 建议的最小样本。只需创建新的控制台应用程序,将minimal.cpp 文件添加到它以及上面提到的所有内容。

编译器生成了一个Minimal.exe 文件,我用wine 成功打开了该文件。

注意:我在问题中提到的所有包含目录都位于编译器的wx-config --cflags 和链接器的wx-config --libs 中,因此无需将它们添加到搜索目录中。

【讨论】:

  • 在“其他编译器选项”中键入命令时应使用`(反引号)。即:(backtick)wx-config --cxxflags(backtick)。如果那些没有反引号的命令从终端成功执行,那么您应该在 C::B 选项对话框中使用反引号。那么一切都会好起来的。另外,请确保系统上没有安装其他 wx,因为您将 wx-config 的 PATH 添加到 .bashrc 中的 PATH 变量的末尾。
  • 您是否安装/编译了另一个 wxWidgets?我的猜测是它会选择您已经安装在系统上的那个,并且由于您将 PATH 放在最后,系统将永远找不到它。尝试从终端运行wx-config --cxxflags,看看输出是什么。
  • @Igor 终端的输出是:-I/usr/i686-w64-mingw32/lib/wx/include/i686-w64-mingw32-msw-unicode-static-3.1 -I/usr/i686-w64-mingw32/include/wx-3.1 -D_FILE_OFFSET_BITS=64 -D__WXMSW__ -mthreads。我认为i686-w64-mingw32 编译器是正确的。但看来你是对的,Synaptic 向我展示了另一个版本的 wxWidgets 安装,即 libwxgtk3.0-0,我认为它似乎与 C::B 一起安装(不确定),可能这是错误!
  • 这不是错误。 C::B 使用它自己的 wxWidgets 版本,它单独与 C::B 一起安装。尝试将 wx-config 的路径放在 PATH 环境变量中,而不是最后。完成后不要忘记将其删除。
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多