无法使用 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。我的处理器是英特尔®;核心™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运行良好,可以完成您期望的操作。我有另一个使用GSL(GNU科学库)的程序,它用C编写,也运行良好,与-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上运行的可执行文件,对于基本程序(即没有"外部"库),它运行良好(用x86_64-w64-mingw32-gcci686-w64-mingw32-gcc取代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的.so是使用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,都会出现完全相同的问题。

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

因此,如果你有一个依赖OpenCL的Windows 64位应用程序,你需要将其与OpenCL的Windows64位版本链接。

OpenCL的来源可以在这里找到:

  • https://github.com/KhronosGroup/OpenCL-Headers
  • https://github.com/KhronosGroup/OpenCL-ICD-Loader

所以您需要先构建这些。

相关内容

  • 没有找到相关文章

最新更新