【发布时间】: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 链接(因此我认为我的代码或常规编译过程没有问题)。 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 上运行的可执行文件,并且对于基本程序(即没有“外部”库)它运行良好(将 gcc 替换为x86_64-w64-mingw32-gcc 或 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.hpp 或 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++ 或i686-w64-mingw32-g++ 还是它们的gcc 对应物,都会出现完全相同的问题。
【问题讨论】:
-
您不能将本机 gcc 的头文件/库用于 mingw 构建,您需要为所有使用的库 (GSL/OpenCL) 安装 mingw 构建。
标签: c++ compilation mingw