質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

Natvisをcmakeで認識してvsのprojectに追加する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,194

yumetodo

score 3579

Visual Studioのデバッガでの表示をカスタマイズするものとしてNatvisがあるわけですが、  
Create custom views of native objects in the debugger | Microsoft Docs

.vcxprojでそれを追加して認識させるためには

  <ItemGroup>
    <Natvis Include="inferior_vector.natvis" />
  </ItemGroup>

のように追加すればいいとわかっています。

現在CMakeを使ってVSのプロジェクトを生成している都合上、CMakeで認識して上記のようなものを吐かせたいわけです。

CMake側での対応としては
Support natvis source file type in the MSVC Project Generator (#16043) · Issues · CMake / CMake · GitLab
というのがあって、CMake version 3.7.0に含まれているはずです。

しかしどうやって利用すればいいのかわかりません。

extension:cmake natvisGithubを調べてみても、

SET_SOURCE_FILES_PROPERTIES(<natvis files> LANGUAGE natvis)

のようにしているものか、あとはadd_executableに直接渡している例が殆どで(他のはライブラリビルド時に含めるものなので今回は除外)それらはいずれも動きません(前者はなんの効果もなく、後者は認識されない拡張子で弾かれる)

${CMAKE_SOURCE_DIR}/../inferioir/vector/inferior_vector.natvisを認識させるにはどのように下記のスクリプトを書き換えればいいでしょうか?

cmake_minimum_required(VERSION 3.7.0)
enable_language(CXX)
set(CMAKE_CXX_STANDARD 14) # C++14...
set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required...
set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11

#
# Set our project name
#
project(inferior_test)

#
# Source files
#
set(inferior_test_src
    main.cpp
)

#
# find inferior
#
include_directories(${CMAKE_SOURCE_DIR}/..)

#
# find iutest
#
if(EXISTS ${CMAKE_SOURCE_DIR}/../iutest/include)
  set(IUTEST_ROOT_DIR ${CMAKE_SOURCE_DIR}/../iutest)
endif()

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/../cmake/modules)
include(FindIutest)
find_package(IUTEST)
include_directories(${IUTEST_INCLUDE_DIR})

#
# Update compiler waring flags
#
if(MSVC)
  # Force to always compile with W4
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-long-long -pedantic")
endif()

#
# Compile
#
add_executable(inferior_test ${inferior_test_src})

#
# Link
#
if(WIN32)
  target_link_libraries(inferior_test ws2_32)
endif()
# - Try to find iutest include dirs
#
# Usage of this module as follows:
#
#     find_package(IUTEST)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
#  IUTEST_ROOT_DIR          Set this variable to the root installation of
#                            iutest if the module has problems finding the
#                            proper installation path.
#
# Variables defined by this module:
#
#  IUTEST_FOUND             System has iutest, include and library dirs found
#  IUTEST_INCLUDE_DIR       The iutest include directories.

find_path(IUTEST_ROOT_DIR
        NAMES include/iutest.hpp
        )

find_path(IUTEST_INCLUDE_DIR
        NAMES iutest.hpp
        HINTS ${IUTEST_ROOT_DIR}/include
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(IUTEST DEFAULT_MSG
    IUTEST_INCLUDE_DIR
)

 追記

set(inferior_test_src
    main.cpp
    ${CMAKE_SOURCE_DIR}/../inferioir/vector/inferior_vector.natvis
)

のように変更しましたがだめですね。

The CXX compiler identification is MSVC 19.12.25835.0
Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.12.25827/bin/Hostx86/x64/cl.exe
Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.12.25827/bin/Hostx86/x64/cl.exe -- works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Detecting CXX compile features
Detecting CXX compile features - done
The C compiler identification is MSVC 19.12.25835.0
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.12.25827/bin/Hostx86/x64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.12.25827/bin/Hostx86/x64/cl.exe -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
Found IUTEST: C:/Users/yumetodo/Documents/git/inferior/iutest/include  
Configuring done
CMake Error at CMakeLists.txt:55 (add_executable):
  Cannot find source file:

    C:/Users/yumetodo/Documents/git/inferior/inferioir/vector/inferior_vector.natvis

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error: CMake can not determine linker language for target: inferior_test
Generating done

CMake: 3.10.1
Visual Studio 2017

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こんにちは。

CMakeのソースを見てみましたが、ソース・ファイルの1つとして指定すればよさそうです。
.natvisを使ってVisual Studioのデバッグを見やすくするのソースをちょっと修正してやってみたらうまくいきました。

natvis_test.cpp(元記事のソースにコンストラクタとデストラクタを追加しました)

#include <iostream>
#include <algorithm>

struct MyArray
{
    int*    m_data;
    int     m_size;
    MyArray(std::size_t iSize) : m_data(new int[iSize]), m_size(iSize)
    {
        std::fill(m_data, m_data+m_size, 0);
    }
    ~MyArray()
    {
        delete[] m_data;
    }
};

int main()
{
    MyArray array( 10 );
    return 0;
}

MyArray.natvis(元記事のままです)

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="MyArray">
    <DisplayString>{{[size] = {m_size}}}</DisplayString>
    <Expand>
      <Item Name="size">m_size</Item>
      <ArrayItems>
        <Size>m_size</Size>
        <ValuePointer>m_data</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

CMakeLists.txt(オリジナルです)

project(natvis_test)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /EHsc")

add_executable(natvis_test natvis_test.cpp MyArray.natvis)

これでQiitaの記事のようにarrayの内容が表示されました。

Visual Studio 2017 Community
CMake 3.10.2


natvis知りませんでしたが、便利そうですね。
一々xmlファイルを作る根性はないですが、STL用のnatvisファイルって提供されていると良いですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/25 01:48

    あああ、単純にnatvisファイルへのパスが間違っていたというかtypoしていた(inferioirじゃなくてinferior)。あたしってば本当におバカ。

    キャンセル

  • 2018/02/25 02:03

    どんまい

    キャンセル

  • 2018/02/25 02:11

    検索可能性がない話なので
    https://qiita.com/yumetodo/items/bd8f556ab56298f19ba8
    に追記しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る