【问题标题】:How to config cmake for strip file如何为条形文件配置cmake
【发布时间】:2016-12-05 03:36:03
【问题描述】:

当我在发布模式下使用 cmake 时,我有以下二进制文件:

64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=485ac09b0a3aa879f88b7f5db6c00ea8d8e1eaf6, not stripped

我希望剥离二进制文件。 如何以一种干净的方式告诉 cmake 将 -s 选项添加到我的编译器以使其剥离?

为什么默认发布模式没有删除我的二进制文件?

【问题讨论】:

  • 请注意,当您通过 cmake --install 安装 CMake 项目时,您可以提供 --strip 参数,该参数将在安装时删除所有内容。以这种方式做事通常更清洁。无论如何,您不应该从 build 文件夹进行部署,因为 RPATH 会被弄乱。

标签: c++ gcc compilation cmake release


【解决方案1】:

最简洁的方法是修改 CFLAGS 或 CXXFLAGS(取决于 C 或 C++ 代码)

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

但是,如果您不想更改构建系统,还有另外一种技巧(确定将上述行放在何处可能会很棘手)。您可以将 strip 用作独立应用程序,例如:

strip -s a.out

并在可执行文件准备好发布后作为构建后步骤执行此操作。我发现这种方式更干净,但会干扰编译器标志。

【讨论】:

  • 您也可以将-DCMAKE_C_FLAGS="-s" 传递给CMake 调用,而不是更改您的文件。
  • 同意。如果您只想剥离发布版本,则更好 -DCMAKE_C_FLAGS_RELEASE。但是,如果 cmake 构建覆盖而不是添加标志,这可能会很危险(自定义构建的常规情况)。
  • 将这两行复制粘贴到我的 CMakeLists.txt 中。没什么区别。同时,独立的 /usr/bin/strip 将二进制文件大小减少到原来的 55%。
  • 如果您使用调试符号链接到库,这将不起作用。最好在链接上剥离,而不是在 CXX 中。
  • MSVS 不需要这个。使用 Windows 上的 Visual C++(和其他 Microsoft 编译器),符号不是二进制文件的一部分。相反,它们存储在称为“程序数据库”文件(.pdb 文件)的单独文件中。
【解决方案2】:

你可以试试

set_target_properties(TARGET_NAME PROPERTIES LINK_FLAGS_RELEASE -s)

【讨论】:

  • 这比只设置编译器标志要好,因为这只会影响所需的目标而不是所有目标
  • @وليدتاجالدين - 它实际上更糟糕,因为它将您的项目锁定在能够理解-s标志的编译器中,其含义与您的预期相同。
  • @AlexReinking - 我的意思是比接受的答案更好 - 对于我不需要剥离所有目标的情况 - 因为接受的答案已经在使用's'标志。我认为您对该问题的评论对于剥离所有目标会更好。
【解决方案3】:

这很好用:

add_link_options($<$<CONFIG:RELEASE>:-s>)

【讨论】:

    【解决方案4】:

    使用add_link_options()set_target_properties() 添加-s 应该可以正常工作,此外,CMake 会创建一个install/strip 目标,如果您有至少一个install() 命令,它也可以用于条带化二进制文件目标(reference)

    例子:

    $ cmake --build . --config Release --target install/strip
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多