c++ - 无法使用 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
(因此我认为我的代码或常规编译过程没有问题)。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
or 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
or找到它们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
对应物,都会出现完全相同的问题。
解决方案
交叉编译时,请确保您仅将针对同一平台的事物链接在一起。换句话说,您的依赖项(及其依赖项)必须针对相同的目标平台。您无法为您的构建平台链接这些库。
因此,如果您有一个依赖于 OpenCL 的 Windows 64 位应用程序,则需要将其与 OpenCL 的 Windows 64 位构建链接。
OpenCL 的源代码可以在这里找到:
所以你需要先建立这些。
推荐阅读
- c - 如何停止打印有条件的字符串?
- python - 如何获得键值等于函数参数?
- python - 如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段
- java - 如何从 sql 准备语句中删除单引号
- sql - 查询列包含特定单词的所有列不起作用?
- c++ - 限制整数的 istream 读取宽度
- mysql - 有什么方法可以禁用特定 mysql 数据库的区分大小写选项,直到下次重新启动?
- google-apps-script - 使用 getRangeList 导入范围
- r - 在 IF 语句中,以组数和每组观察数为条件
- swift - 核心数据中的 IN 子句 - Swift