2016-11-16 230 views
9

我使用的是CLion 2016.2.2,我想調試libtins庫中的方法。但是,看起來源代碼不可用,因爲當試圖從libtins跳入方法時,調試器不會進入並僅更新當前視圖。CLion:通過添加源文件啓用外部庫的調試

我試着按照this post中的建議添加include_directories("/home/patrick/libtins/")include_directories("/home/patrick/libtins/src/"),而libtins是從libtins存儲庫克隆的根文件夾。但CLion仍然找不到與libtins庫相關的源文件。

我的CMake的文件看起來如下:

project(myproject) 

# Define CMake settings 
cmake_minimum_required(VERSION 3.2) 

IF(NOT CMAKE_BUILD_TYPE) 
    SET(CMAKE_BUILD_TYPE "Release") 
ENDIF() 

IF (CMAKE_BUILD_TYPE MATCHES Debug) 
    MESSAGE(STATUS "Running Debug configuration.") 
ELSEIF (CMAKE_BUILD_TYPE MATCHES Release) 
    MESSAGE(STATUS "Running Release configuration.") 
ENDIF() 

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

SET(CMAKE_CXX_STANDARD 11) 
SET(CMAKE_CXX_STANDARD_REQUIRED ON) 

# Add the library source files 
SET(SOURCE_FILES cxx/myclass.cpp cxx/myclass.h) 

# Include SQLiteCpp library and build it 
option(SQLITECPP_RUN_CPPLINT OFF) 
include_directories(SQLiteCpp/include) 
add_subdirectory(SQLiteCpp) 

# Find libtins library 
FIND_LIBRARY(TINS_LIBRARY tins) 
IF(TINS_LIBRARY) 
    MESSAGE(STATUS "Tins library found in ${TINS_LIBRARY}") 
ELSE() 
    MESSAGE(FATAL_ERROR "Tins library not found.") 
ENDIF() 

FIND_PACKAGE(PythonLibs 3.0 REQUIRED) 
IF(PYTHONLIBS_FOUND) 
    INCLUDE_DIRECTORIES("${PYTHON_INCLUDE_DIRS}") 
ELSE() 
    MESSAGE(FATAL_ERROR "Unable to find Python libraries.") 
ENDIF() 

# Find and configure BOOST library 
FIND_PACKAGE(Boost 1.54 QUIET) 
IF (Boost_FOUND) 
    INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}") 
    SET(Boost_USE_STATIC_LIBS OFF) 
    SET(Boost_USE_MULTITHREADED ON) 
    SET(Boost_USE_STATIC_RUNTIME OFF) 
    # Find the boost python 3 component 
    SET(PYTHON_VERSIONS python3 python-py35 python-py34 python-py33 python-py32) 
    FOREACH(VERSION ${PYTHON_VERSIONS}) 
     FIND_PACKAGE(Boost COMPONENTS ${VERSION} QUIET) 
     IF(Boost_FOUND) 
     MESSAGE(STATUS "Python Boost found as '${VERSION}'.") 
     BREAK() 
     ENDIF() 
    ENDFOREACH(VERSION) 
    IF(NOT Boost_FOUND) 
     MESSAGE(FATAL_ERROR "Python Boost component not found.") 
    ENDIF() 
ELSE() 
    MESSAGE(FATAL_ERROR "Unable to find the Boost libraries (version 1.54 or higher).") 
ENDIF() 

SET_target_properties(sqlite3 PROPERTIES POSITION_INDEPENDENT_CODE ON) 

ADD_EXECUTABLE(myproject ${SOURCE_FILES} "/home/pjattke/libtins/") 
TARGET_LINK_LIBRARIES(myproject ${Boost_LIBRARIES} "${TINS_LIBRARY}" SQLiteCpp sqlite3 pthread dl) 

究竟我必須改變,以使可用於調試的克利翁的源文件?

回答

3

如果libtins是在沒有調試信息的情況下構建的,則可能會發生這種情況。你究竟如何構建它?

應該大致有以下幾種:

mkdir build 
cd build 
cmake -DCMAKE_BUILD_TYPE=Debug ../ 
make 
1

最簡單的方式這樣做是直接在項目建設libtins。 由於libtins can also be built with CMake,爲你做到這一點,最快的方法就是在包含libtins source源目錄中的項目與

add_subdirectory(libtins) 

添加一個名爲libtins目錄,包括它爲此,您需要滿足還有libtins的dependencies

然後,您不需要FIND_LIBRARY(TINS_LIBRARY tins)了,因爲它已經存在於您的項目中。要鏈接它下面應該做的伎倆:

TARGET_LINK_LIBRARIES(myproject ${Boost_LIBRARIES} tins SQLiteCpp sqlite3 pthread dl) 

不要忘了包括罐頭目錄事先:

include_directories(libtins/include/tins) 

在此之後,當你在調試模式下運行程序時,libtins方法應也是可用的,因爲它被建成相同到您的項目。

請注意,如果您想長期將libtins包含在項目中,我會選擇另一種策略。然後,我寧願尋找ExternalProject_Add command的解決方案。

+3

認真嗎?用於調試到外部庫(已安裝調試信息)的UL認證解決方案是將庫作爲項目的一部分構建?我幾乎沒有那麼容易。我也對CLion有這個問題 - 我發現即使gdb可以找到庫資源,CLion仍然不能。 –

+0

@JohnCalcote將庫構建爲項目的一部分,確保您具有與項目其他部分相同的編譯標誌(這裏是debug)。所以,是的,CLion會找到它的,對,我會這麼簡單。在任何情況下,都不能依賴調試信息進行安裝。 – oLen

+0

@JohnCalcote是100%正確的。在大多數情況下,建議完全重做外部構建是瘋狂的。大多數項目都有非常複雜的構建系統,並建議您隨便將它放入自己的構建系統中,這不是現實。 –

0

下面在Ubuntu 16.04.3 LTS和CLion 2017.3.3中爲我工作。

首先,你必須更換克利翁捆綁gdb與Ubuntu的原始(不知道爲什麼):

$ cd ~/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/173.4548.31/bin/gdb/bin 
$ mv gdb gdb_original 
$ ln -s /usr/bin/gdb gdb 

然後啓動調試會話步入庫代碼之前放置一個斷點。

當在斷點處停止執行時,轉至GDB控制檯選項卡並執行此操作,指向要調試的源代碼所在的完整路徑。例如,爲了調試OpenSSL的BIO_new功能我不得不這樣做:

(gdb) dir /full/path/to/openssl-1.0.2g/crypto/bio 

因爲BIO_newbio_lib.c駐留在一個文件夾來實現。

現在你可以進入你的庫代碼。