2016-11-16 57 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驻留在一个文件夹来实现。

现在你可以进入你的库代码。