我构建动态库 .dll 没有任何问题:
mkdir build
cd build
cmake .. -A Win32 -T ClangCL
cmake --build .
同样的事情在 Ubuntu 22.04 中工作正常,只有 .so:
mkdir build
cd build
export CC=path to clang CXX=path to clang++
cmake .. -G Ninja -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
cmake --build .
但是如何在 Windows 上为 Linux 构建库呢?我有 Ninja 和 Clang。
好吧,如果有人可以提供解决方案,那么请告诉我如何做同样的事情,但是是在 Win 下的 Linux 上。
我记得以前做过类似的事情...你必须朝着MSYS64的方向挖掘并安装GCC。是否无法使用 Clang 在 Win 下的 Linux 下构建?
首先,非交叉编译(即直接在目标系统上)要简单得多。因此,从 Windows 到 Linux,在 WSL2 或其他虚拟机中编译会更容易。
但没有这个也是可能的。答案的其余部分是基于您不想使用虚拟机的假设编写的。
反之亦然! Clang 使交叉编译变得更加容易。要使用GCC进行交叉编译,需要重新编译(并在构建时选择所需的平台)。而且 Clang 不需要重新编译;它的任何版本都可以针对任何平台进行编译。
Klang 需要来自目标系统的标头和库。您可以
/从 Linux 复制所有内容,也可以尝试扔掉多余的内容。然后使用 flags 进行编译--target=платформа --sysroot=путь_до_папки。平台名称可以clang --version通过在所需平台上运行来查看。可能需要添加标志:(
-stdlib=...标准 C++ 库)、、、、-rtlib=...... - 通过重新了解-unwindlib=...它们-f[no-]emulated-tls在目标平台上的含义或通过选择。关于 CMake:如果使用它,则无需将标志手动传递给编译器。您需要编写一个工具链文件,以便 CMake 自行完成此操作。
对于 linux->windows 的情况,发行版通常在其包管理器中包含 MinGW(用于在 Windows 下构建的 GCC 版本,包含所有必需的库)。
或者,您可以仅从 MinGW 获取库并使用 Clang(Linux 的常用版本)进行编译 - 请参阅上面的标志。
发行版通常包含过时的 MinGW(尤其是在某些 Ubuntu LTS 中......),因此下载 Windows 版 MinGW 可能是有意义的(找到最新版本不是问题),并将 Klang 指向它的路径(通过
--sysroot=)。 (理论上,你甚至可以在 wine 中运行它,但这很慢。)好吧,如果不是很明显的话,所有使用的第三方库都需要针对目标系统重新编译。
对于 windows->linux 的情况,您可以在将它们复制
/到 Windows 之前从 Linux 上的包管理器安装它们。对于 linux->windows 的情况,从MSYS2 存储库中获取已编译的库很方便。 MSYS2 本身仅适用于 Windows,并且是为 Windows 编译的,但您可以手动下载压缩库。
作为广告:我有一些脚本可以在 Linux 上自动从 MSYS2 下载库(同时执行其他操作:将必要的标志传递给 clang/cmake/...)。
您还可以使用像 Conan 这样的包管理器,它可以以某种方式自动执行交叉编译。
好吧,为了完整性。有msvc-wine,用于在 Wine 中的 Linux 上运行 MSVC,并以这种方式进行交叉编译。它不太可能适合实际用途,因为它很慢,但您可以将库从它转移到 Klang。 (mingw 不会与第三方库兼容。)