gpt4 book ai didi

linker - CMake:如何生成二进制文件 "as static as possible"

转载 作者:行者123 更新时间:2023-12-03 06:14:57 30 4
gpt4 key购买 nike

我想控制在 CMake 中找到/与我的二进制文件链接的库的类型。最终目标是生成“尽可能静态”的二进制文件,即静态链接到每个具有可用静态版本的库。这很重要,因为可以在测试期间实现二进制文件跨不同系统的可移植性。

ATM 这似乎很难实现,因为 FindXXX.cmake 包,或者更准确地说,只要静态和动态都可用,find_library 命令总是会选取动态库。

非常欢迎有关如何实现此功能的提示(最好以优雅的方式)!

最佳答案

我做了一些调查,虽然我找不到令人满意的解决方案,但我确实找到了一个一半的解决方案。

静态构建的问题归结为三件事:

  1. 构建并链接项目的内部库。

    非常简单,只需将BUILD_SHARED_LIBS开关OFF即可。

  2. 查找外部库的静态版本。

    唯一的方法似乎是设置CMAKE_FIND_LIBRARY_SUFFIXES以包含所需的文件后缀(这是一个优先级列表)。

    这个解决方案相当“肮脏”,并且非常违背 CMake 的跨平台愿望。恕我直言,这应该由 CMake 在幕后处理,但据我了解,由于 Windows 上的“.lib”混淆,似乎 CMake 开发人员更喜欢当前的实现。

  3. 静态链接系统库。

CMake 提供了一个选项 LINK_SEARCH_END_STATIC它基于文档:“结束链接行,以便使用静态系统库。”人们会想,就是这样,问题解决了。然而,目前的实现似乎并不能胜任这项任务。如果打开该选项,CMake 会生成一个隐式链接器调用,其参数列表以传递给链接器的选项结尾,包括 -Wl,-Bstatic。然而,这还不够。仅指示链接器静态链接会导致错误,在我的例子中:/usr/bin/ld: 找不到 -lgcc_s。缺少的是告诉 gcc 我们需要通过 -static 参数进行静态链接,该参数不是由 CMake 生成的链接器调用。我认为这是一个错误,但我还没有得到开发人员的确认。

最后,我认为所有这些都可以而且应该由 CMake 在幕后完成,毕竟它并没有那么复杂,只是在 Windows 上是不可能的 - 如果这算复杂的话......

关于linker - CMake:如何生成二进制文件 "as static as possible",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762057/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com