C++ CLion:通过添加源文件启用外部库的调试

C++ CLion:通过添加源文件启用外部库的调试,c++,debugging,cmake,clion,libtins,C++,Debugging,Cmake,Clion,Libtins,我正在使用CLion 2016.2.2,我想调试库中的一个方法。但是,源代码似乎不可用,因为当尝试从libtins跳转到方法时,调试器不会进入,而只是更新当前视图 我试图按照中的建议添加include_目录(“/home/patrick/libtins/”)或include_目录(“/home/patrick/libtins/src/”),而libtins是从libtins存储库克隆的根文件夹。但是CLion仍然找不到与libtins库关联的源文件 我的CMake文件如下所示: project(

我正在使用CLion 2016.2.2,我想调试库中的一个方法。但是,源代码似乎不可用,因为当尝试从libtins跳转到方法时,调试器不会进入,而只是更新当前视图

我试图按照中的建议添加
include_目录(“/home/patrick/libtins/”)
include_目录(“/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)

要使源文件中的CLion可用于调试,我必须更改哪些内容?

如果libtins是在没有调试信息的情况下生成的,则可能会发生这种情况。你到底是如何建造它的

大致应如下所示:

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ../
make
最简单的方法是直接在项目中构建libtin。 因为,最快的方法是在包含libtin的源目录中添加一个名为
libtins
的目录,并将其包含在您的项目中

add_subdirectory(libtins)
为此,您还需要实现libtins的功能

然后,您不再需要
FIND_LIBRARY(TINS_LIBRARY TINS)
,因为它已经存在于您的项目中。要将其链接起来,应使用以下方法:

TARGET_LINK_LIBRARIES(myproject ${Boost_LIBRARIES} tins SQLiteCpp sqlite3 pthread dl)
请不要忘记预先包含TIN目录:

include_directories(libtins/include/tins)
在此之后,当您在调试模式下运行程序时,libtins方法也应该可用,因为它是与您的项目相同地构建的


请注意,如果您希望在项目中长期包含libtin,我将选择另一种策略。然后,我更愿意寻找一个解决方案。

以下内容在Ubuntu 16.04.3 LTS和CLion 2017.3.3中适用于我

首先,您必须用Ubuntu的原始版本替换捆绑的CLion
gdb
(不确定原因):

然后启动调试会话,在进入库代码之前放置断点

当执行在断点处停止时,转到GDB控制台选项卡,并指向要调试的源代码所在的完整路径执行此命令。例如,要调试OpenSSL的
BIO_new
函数,我必须执行以下操作:

(gdb) dir /full/path/to/openssl-1.0.2g/crypto/bio
因为
BIO_new
是在位于上一个文件夹中的
BIO_lib.c
中实现的


现在您可以输入库代码。

真的吗?UL批准的调试到外部库(安装了调试信息)的解决方案是将库作为项目的一部分进行构建?我不认为这很容易。我对CLion也有这个问题-我发现即使gdb可以找到库源,CLion仍然无法找到。@johncallote将库构建为项目的一部分,以确保您与项目的其他部分具有相同的编译标志(这里是debug)。所以,是的,克莱恩会找到的,是的,我认为这很容易。在任何情况下都不能依赖于安装的调试信息。@JohnCalcote是100%正确的。在大多数情况下,建议完全重做外部构建是疯狂的。大多数项目都有极其复杂的构建系统,建议你只是随便把它放到你自己的构建系统中是不现实的,非常有用。我不需要交换捆绑的gdb,但能够让Clion开始使用库中的源代码。在这样做的过程中,我能够在进入反汇编部分后添加源路径……然后在下一步它就转到了源代码。非常感谢。
(gdb) dir /full/path/to/openssl-1.0.2g/crypto/bio