首页 > 解决方案 > 无法使用 mingw 编译链接 Linux 上的库以创建适用于 Windows 的可执行文件

问题描述

我正在尝试从我的 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)集成 GPU。

显示我当前情况的最小示例包括以下代码(称为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 上运行的可执行文件,并且对于基本程序(即没有“外部”库)它运行良好(替换gccx86_64-w64-mingw32-gccor i686-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.hppor找到它们dpkg -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++ori686-w64-mingw32-g++或它们的gcc对应物,都会出现完全相同的问题。

标签: c++compilationmingw

解决方案


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

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

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

所以你需要先建立这些。


推荐阅读