我正试图从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
链接(因此我认为我的代码或常规编译过程没有问题)。OpenCL和GSL都是从官方存储库(~# 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-gcc
或i686-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.hpp
或dpkg -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
所以您需要先构建这些。