交叉编译时包含外部库
Include external libraries when cross-compiling
我有一个使用 OpenCV 的 C++ 项目。它可以在 Mac 上正确编译和运行,但我想从我的 Mac 计算机生成一个 Windows 可执行文件。我通过 Homebrew 安装了 MinGW-W64。
我的疑惑如下。我如何告诉 MinGW-W64 使用 OpenCV 库来交叉编译?正如预期的那样,仅用 x86_64-w64-mingw32-g++
替换 g++
是行不通的,会输出大量与未声明的 OpenCV 函数相关的错误。
我读到有必要交叉编译 OpenCV 库,但我不知道这到底是什么意思。我是否需要从本地 OpenCV 安装创建中间 *.o
文件并将它们与我自己的 C++ 代码的 *.o
文件链接以最终生成 .exe
输出?所有这些都使用 x86_64-w64-mingw32-g++
?
如果是的话,我对 Make 或 CMake 等工具没有太多专业知识,但我想有一种方法可以使整个过程自动化(我的 makefile 非常简单,只需使用一个 g++
命令)。
有人能为我指出正确的方向吗?提前致谢!
是的,您需要使用 mingw 交叉编译 OpenCV,以便为 Windows 交叉编译您的项目。这意味着您将需要克隆源代码并使用 mingw 编译器完成构建说明。使用 mingw 构建 OpenCV 后,您需要在交叉编译时将项目指向使用这些库。
OpenCV 存储库使用并包含用于构建库的 cmake 文件。一般都是用cmake生成makefile,然后用生成的makefile来构建你运行make
。因为你想交叉编译,你需要告诉 cmake 生成使用 mingw32-make
而不是 make
的 makefile(因为 ming32-make
将使用 mingw g++ 而不是普通的 g++)。要让 cmake 生成 mingw makefile,您可以使用 -G "MinGW Makefiles" and then build with
mingw32-make 调用它。您可能想考虑使用静态链接而不是动态链接,但是如果您 want/need 使用动态链接,则需要将 opencv 构建的输出复制到 Windows 上的某个位置并将该位置添加到小路。
请记住,在使用 mingw 交叉编译 OpenCV 时,启用 CUDA 支持标志可能不起作用。 (我最近没有检查过,但我想我记得那是一件事)
我有一个使用 OpenCV 的 C++ 项目。它可以在 Mac 上正确编译和运行,但我想从我的 Mac 计算机生成一个 Windows 可执行文件。我通过 Homebrew 安装了 MinGW-W64。
我的疑惑如下。我如何告诉 MinGW-W64 使用 OpenCV 库来交叉编译?正如预期的那样,仅用 x86_64-w64-mingw32-g++
替换 g++
是行不通的,会输出大量与未声明的 OpenCV 函数相关的错误。
我读到有必要交叉编译 OpenCV 库,但我不知道这到底是什么意思。我是否需要从本地 OpenCV 安装创建中间 *.o
文件并将它们与我自己的 C++ 代码的 *.o
文件链接以最终生成 .exe
输出?所有这些都使用 x86_64-w64-mingw32-g++
?
如果是的话,我对 Make 或 CMake 等工具没有太多专业知识,但我想有一种方法可以使整个过程自动化(我的 makefile 非常简单,只需使用一个 g++
命令)。
有人能为我指出正确的方向吗?提前致谢!
是的,您需要使用 mingw 交叉编译 OpenCV,以便为 Windows 交叉编译您的项目。这意味着您将需要克隆源代码并使用 mingw 编译器完成构建说明。使用 mingw 构建 OpenCV 后,您需要在交叉编译时将项目指向使用这些库。
OpenCV 存储库使用并包含用于构建库的 cmake 文件。一般都是用cmake生成makefile,然后用生成的makefile来构建你运行make
。因为你想交叉编译,你需要告诉 cmake 生成使用 mingw32-make
而不是 make
的 makefile(因为 ming32-make
将使用 mingw g++ 而不是普通的 g++)。要让 cmake 生成 mingw makefile,您可以使用 -G "MinGW Makefiles" and then build with
mingw32-make 调用它。您可能想考虑使用静态链接而不是动态链接,但是如果您 want/need 使用动态链接,则需要将 opencv 构建的输出复制到 Windows 上的某个位置并将该位置添加到小路。
请记住,在使用 mingw 交叉编译 OpenCV 时,启用 CUDA 支持标志可能不起作用。 (我最近没有检查过,但我想我记得那是一件事)