zoukankan      html  css  js  c++  java
  • 使用CMake,且在GCC编译时指定相对源代码路径选项BUG的问题

    CMake的build.make,每次都是cd xxx目录,然后再编译

    而编译时,GCC会取当前路径保存进调试信息的DT_AT_comp_dir,GCC的编译器选项-fdebug-prefix-map=old=new,允许将路径做一个映射替换,比如将/usr/loca/src/gowork/src/kurento/kms-core/替换成./

    同时DT_AT_name编译进的会是相应源代码文件的路径信息,也会受到-fdebug-prefix-map选项的影响。

    如上例,最终编译的调试信息中,DT_AT_comp_dir会是./obj-x86_64-linux-gnu/src/gst-plugins/

    而DT_AT_name会是./src/gst-plugins/kmscore.c。

    GDB调试时,对于DT_AT_name是相对路径,会与DT_AT_comp_dir进行拼装,路径信息会拼装成./obj-x86_64-linux-gnu/src/gst-plugins/./src/gst-plugins/kmscore.c

    就会出现源代码找不到的情况,这时候只能强制在编译时去除-fdebug-prefix-map选项,由于CMAKE在新版本的C_FLAGS默认就启用了-fdebug-prefix-map

    因此只能在CMakeLists.txt中去除相应选项,类似如下代码,插入到合适位置(正则表达式不完善,各位可以自行调整)

    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_C_FLAGS           ${CMAKE_C_FLAGS} )
    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_CXX_FLAGS         ${CMAKE_CXX_FLAGS} )
    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_C_FLAGS_DEBUG     ${CMAKE_C_FLAGS_DEBUG} )
    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_CXX_FLAGS_DEBUG   ${CMAKE_CXX_FLAGS_DEBUG} )
    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_C_FLAGS_RELEASE   ${CMAKE_C_FLAGS_RELEASE} )
    STRING( REGEX REPLACE "\-fdebug-prefix-map=[a-zA-Z0-9/=.\-]*" " " CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )
    

      

  • 相关阅读:
    Hibernate,get()和load()区别
    Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征
    Hibernate,Session清理缓存时间点
    frameset子窗口获取父窗口失败原因?
    struts2,实现Ajax异步通信
    struts2-json-plugin插件实现异步通信
    Hibernate,JPA注解@ManyToMany_JoinTable
    Hibernate,JPA注解@ManyToMany
    SparkStreaming操作Kafka
    DirectStream、Stream的区别-SparkStreaming源码分析02
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/10324671.html
Copyright © 2011-2022 走看看