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