如何防止cmake剥离创建的共享库

时间:2018-12-18 22:24:23

标签: linux cmake

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

这适用于cmake版本3.7.2。

1 个答案:

答案 0 :(得分:-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