web-dev-qa-db-ja.com

CLion:ソースファイルを追加して外部ライブラリのデバッグを有効にします

CLion 2016.2.2を使用していて、 libtins ライブラリのメソッドをデバッグしたいと思います。ただし、libtinsからメソッドにジャンプしようとすると、デバッガーはアクセスせず、現在のビューを更新するだけなので、ソースが利用できないようです。

この投稿 の提案に従って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)

CLionをデバッグに使用できるソースファイルにするには、正確に何を変更する必要がありますか?

15
Patrick

これは、libtinsがデバッグ情報なしでビルドされた場合に発生する可能性があります。どのくらい正確にそれを構築しますか?

おおまかに次のようになります。

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

以下は、CLion2017.3.3を使用したUbuntu16.04.3LTSで機能しました。

まず、CLionにバンドルされている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_newは前のフォルダにあるbio_lib.cに実装されているためです。

これで、ライブラリコードにステップインできます。

2
Jaime Hablutzel

そのための最も簡単な方法は、プロジェクトで直接libtinをビルドすることです。 libtinsはCMakeでビルドすることもできます なので、これを行う最も速い方法は、libtinsを含むソースディレクトリにlibtinsというディレクトリを追加することです source =、そしてそれをあなたのプロジェクトに含める

_add_subdirectory(libtins)
_

このためには、libtinの 依存関係 も満たす必要があります。

そうすれば、FIND_LIBRARY(TINS_LIBRARY tins)はプロジェクトにすでに存在しているので、もう必要ありません。それをリンクするには、以下がトリックを行う必要があります:

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

事前にt​​insディレクトリを含めることを忘れないでください。

_include_directories(libtins/include/tins)
_

この後、プログラムをデバッグモードで実行すると、プロジェクトと同じようにビルドされたため、libtinsメソッドも使用できるようになります。

長期的にプロジェクトにlibtinを含めたい場合は、別の戦略を選択することに注意してください。次に、 _ExternalProject_Add_コマンド を使用して解決策を探します。

1
oLen