RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1593093
Accepted
punkochel
punkochel
Asked:2024-09-07 15:34:09 +0000 UTC2024-09-07 15:34:09 +0000 UTC 2024-09-07 15:34:09 +0000 UTC

如何从 Windows 构建 .so 库?

  • 772

我构建动态库 .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 下构建?

c++
  • 1 1 个回答
  • 43 Views

1 个回答

  • Voted
  1. Best Answer
    HolyBlackCat
    2024-09-08T00:56:20Z2024-09-08T00:56:20Z

    首先,非交叉编译(即直接在目标系统上)要简单得多。因此,从 Windows 到 Linux,在 WSL2 或其他虚拟机中编译会更容易。

    但没有这个也是可能的。答案的其余部分是基于您不想使用虚拟机的假设编写的。


    对于 MSYS64,您需要挖掘并安装 GCC。是否无法使用 Clang 在 Win 下的 Linux 下构建?

    反之亦然! 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 不会与第三方库兼容。)

    • 1

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5