【问题标题】:how to prevent cmake from stripping the created shared library如何防止cmake剥离创建的共享库
【发布时间】:2018-12-18 22:24:23
【问题描述】:

在调试器中运行可执行文件时,我看不到共享库的任何有意义的堆栈跟踪——只有函数的地址和共享库的路径。

这适用于 cmake 版本 3.7.2。

【问题讨论】:

  • 使用CMAKE_BUILD_TYPERelWithDebInfo 有效吗?
  • 您使用的是哪个生成器?生成文件?
  • I don't see any meaningful stacktrace 这不是 cmake(构建生成器)的问题,而是您的构建(在 cmake 之后运行的东西)的问题。在启用调试符号的情况下进行编译 - 使用 CMAKE_BUILD_TYPE=debug 或将调试编译器选项添加到您的 CMAKE_?_FLAGS。
  • 听起来共享库不是使用调试信息创建的,或者调试共享库不是在运行时加载的。您应该提供有关如何调用 CMake 和生成器的更多详细信息。您能否发布一个重现该问题的最小示例。

标签: linux cmake


【解决方案1】:
  • 默认情况下,CMake 不会剥离您的调试符号。
  • 您需要使用适当的调试选项编译共享库,例如

    cmake -DCMAKE_BUILD_TYPE=Debug ..
    
  • 或者您可以修改您的CMakeLists.txt 以添加调试标志。

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")
    

编辑

CMake 是一个构建脚本工具,它本身不会对你的二进制文件进行剥离,但如果你愿意,你可以请求它来帮助解决这个问题。在此处查看我的其他帖子:Android NDK path variable for **strip** command in CMake build tool chain

如果您想让 CMake 剥离您的调试符号,下面的行将执行符号剥离。

add_custom_command(TARGET ${SHARED_LIBRARY_NAME} POST_BUILD
            COMMAND "<path-to-your-bin>/strip" -g -S -d --strip-debug --verbose
            "<path-to-your-lib>/lib${SHARED_LIBRARY_NAME}.so"
            COMMENT "strip debug symbols done on final binary.")

对于警告,您可以选择是否拥有,这并不重要。

回到问题并进一步澄清,为了获得调试符号,您需要通过在下面键入 cmake 命令以 DEBUGRelWithDebInfo 构建类型构建二进制文件。

cmake -DCMAKE_BUILD_TYPE=Debug ..

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..

如果您正在构建 C 源代码(不是我假设的 cpp),那么您可以查看相应的 CMAKE_C_FLAGS

从这里查看官方文档:https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html

【讨论】:

  • CMake 根本不会去除调试符号。这是添加标志的错误方法,因为它只为 C++ 调试和发布模式添加它,而忽略了可以构建的所有其他配置,您可以通过 target_compile_options 添加它,它不一定是启用警告的 g​​cc 选项。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 2011-04-02
  • 2012-08-05
  • 2013-07-04
  • 1970-01-01
  • 2016-10-05
  • 2016-12-30
  • 2023-03-03
相关资源
最近更新 更多