LoginSignup
2
4

More than 5 years have passed since last update.

Gtags(GNU GLOBAL) で C++ のクラス名のタグが生成されない問題の対応

Posted at

Gtags で C++ のクラス名が正しく取得できない問題が出て、その解決ができたので書き残しておこうと思います。

プロジェクトルートに gtags.conf を配置すると gtags は自動的にその設定を読み込みます。ぼくはスキップしたいディレクトリ build/ があったのでそれを追加しました。
設定は homebrew でインストールした /usr/local/opt/global/share/gtags/gtags.conf からコピーして不要そうな部分を削除しています。

$ cat gtags.conf
default:\
    :tc=gtags:
#---------------------------------------------------------------------
# Configuration for gtags(1)
# See gtags(1).
#---------------------------------------------------------------------
common:\
    :skip=GPATH,GTAGS,GRTAGS,GSYMS,,HTML/,HTML.pub/,html/,tags,TAGS,ID,y.tab.c,y.tab.h,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,build/:
gtags:\
    :tc=common:\
    :langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
gtags

この設定のとき、C++ のプロジェクトで gtags を実行しても global Klass の結果が取得できなかったのが今回の問題です (Klass は例)。

原因

僕の C++ プロジェクトではソースコードの拡張子が .cpp.h なのですが、この gtags.conf の設定では C++ の拡張子に .h がなく、C の方に .h がありました。要するにヘッダファイルだけ C++ ではなく C としてパースされてしまい、C には class が存在しないのでタグが生成されなかったのでした。

解決方法

:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
gtags

この部分を

:langmap=c\:.c,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H.h,php\:.php.php3.phtml:
gtags

と変更しました。あと、C/C++ しか必要がないのでもっとシンプルに

:langmap=c\:.c,asm\:.s.S,cpp\:.c++.cc.cpp.cxx.hxx.hpp.C.H.h:

としておきました。.h は必ず C++ としてパースされてしまいますが、互換性があるはずなので問題ないはずです。まだこの状態でバリバリコードを書いてないのでミスがあるかもしれませんがとりあえず動いてます。

今日の今まで ctags を使い続けてましたが、gtags 良いですね。乗り換えてよかった!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4