使用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} )

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM