【问题标题】:Can't compile with mingw linking a library on Linux to create executable for Windows无法使用 mingw 编译链接 Linux 上的库以创建适用于 Windows 的可执行文件
【发布时间】:2021-10-10 00:28:37
【问题描述】:

我正在尝试从我的 Debian 分区编译 C/C++ 代码以生成一些适用于 Windows 的可执行文件。 在命令行上运行$ uname -a 会得到Linux machine 5.14.0-2-amd64 #1 SMP Debian 5.14.9-2 (2021-10-03) x86_64 GNU/Linux。我的处理器是 Intel® Core™ i5-1035G4 CPU @ 1.10GHz × 8,集成了 Mesa Intel® Iris(R) Plus Graphics (ICL GT1.5)显卡。

显示我当前情况的最小示例包括以下代码(称为code.cpp):

#include <iostream>
#include <CL/opencl.hpp>

int main()
{
  std::vector <cl::Platform> all_platforms; //Get all platforms
  cl::Platform::get(&all_platforms);

  if (all_platforms.size() == 0)
  {
    std::cout << "No platforms found. Check OpenCL installation." << std::endl;
    exit(1);
  }

  int pz = all_platforms.size();
  std::cout << "Platforms size: " << pz << std::endl;

  for (int i = 0; i < pz; i++)
  {
    cl::Platform default_platform = all_platforms[i];
    std::cout << "Using platform: " << default_platform.getInfo<CL_PLATFORM_NAME>() << std::endl;
  }

  return(0);
}

它使用 OpenCL 打印所有可识别的设备。我编译我的代码写g++ code.cpp -o code.out -lOpenCL。可执行文件code.out 工作正常,可以按照您的预期执行。我有另一个程序,它使用用 C 编写的 GSL (GNU 科学图书馆),它也运行良好,与 -lgsl 链接(因此我认为我的代码或常规编译过程没有问题)。 OpenCLGSL 都是从官方存储库 (~# apt install ...) 安装的,完全没有问题。当我执行code.out 时,输出是

Platforms size: 2
Using platform: Intel(R) OpenCL HD Graphics
Using platform: Portable Computing Language

我安装了 mingw(通过 ~# apt install mingw-w64)来创建要在 Windows 上运行的可执行文件,并且对于基本程序(即没有“外部”库)它运行良好(将 gcc 替换为x86_64-w64-mingw32-gcci686-w64-mingw32-gcc)。但是对于上面编写的代码(以及使用 GSL 的代码),它不起作用。这两个示例的大部分错误输出非常相似,我将使用 OpenCL 显示代码的命令行输出。

当我尝试x86_64-w64-mingw32-g++ code.cpp -o code.out -lOpenCL 时,输出是

code.cpp:2:10: fatal error: CL/opencl.hpp: No such file or directory
    2 | #include <CL/opencl.hpp>
      |          ^~~~~~~~~~~~~~~
compilation terminated.

我认为这意味着我需要在链接和包含时更加具体,所以我给出了标头所在的显式路径(通过 dpkg -S opencl.hppdpkg -S gsl*.h 找到它们),以及 OpenCL 的 .so 文件是通过dpkg -S *OpenCL.so 找到的,而GSL 的一个是通过dpkg -S *gsl.so 找到的。当我尝试x86_64-w64-mingw32-g++ code.cpp -o code.out -I/usr/include/ -L/usr/lib/x86_64-linux-gnu/libOpenCL.so 时,输出是

In file included from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/cwchar:44,
                 from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/bits/postypes.h:40,
                 from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/iosfwd:40,
                 from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/ios:38,
                 from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/ostream:38,
                 from /usr/lib/gcc/x86_64-w64-mingw32/10-win32/include/c++/iostream:39,
                 from code.cpp:1:
/usr/include/wchar.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
   27 | #include <bits/libc-header-start.h>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

因此,MinGW 似乎需要额外的说明才能正确查找、包含和/或链接库。我不知道如何解决这个问题。这些是我根据我找到的一些答案所做的尝试,MinGW 提供的文档对此只字未提。无论我使用x86_64-w64-mingw32-g++i686-w64-mingw32-g++ 还是它们的gcc 对应物,都会出现完全相同的问题。

【问题讨论】:

  • 您不能将本机 gcc 的头文件/库用于 mingw 构建,您需要为所有使用的库 (GSL/OpenCL) 安装 mingw 构建。

标签: c++ compilation mingw


【解决方案1】:

在交叉编译时,请确保您只是将针对同一平台的事物链接在一起。换句话说,您的依赖项(及其依赖项)必须针对相同的目标平台。您无法为您的构建平台链接这些库。

因此,如果您有一个依赖于 OpenCL 的 Windows 64 位应用程序,则需要将其与 OpenCL 的 Windows 64 位构建链接。

OpenCL 的源代码可以在这里找到:

所以你需要先构建这些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2013-11-10
    • 2012-12-03
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多