スポンサーリンク

必要な関数やクラスを.libファイルの中から探す

経緯

Point Cloud Library (PCL) と言うのを使っているのですが、その中でstlの入出力をしたくなりました。

#include <pcl/io/vtk_lib_io.h>

をしてから

pcl::io::loadPolygonFileSTL ()

を使ってみましたが、リンクエラーでvtkDebugLeaksManagerが見つからないといわれます。

答えを言うとvtkCommonCore-8.0.lib をリンクすればいいのですが、調べてみてもCMakeすればいいよみたいな情報しかなくて結構困りました。

 

vtkとついているんだからvtkのlibディレクトリを探せばいいことまではわかっています。ある程度目星がついているのに他を探し回るのは嫌だし、だからと言って200個あるlibを一つ一つリンクしてみるのも自分がかわいそうになるので、もう少しましな方法を考えます。

結論

以下のようなBATファイルを作成しました(linksearch.bat)

set LIBFILEPATH=%1
set SEARCHWORD=%2
set OUTPUTFILE=flistresult.txt
@echo on
type nul > %OUTPUTFILE%
@for %%i in (%LIBFILEPATH%) do (
  @echo on
  @echo %%i
  @echo off
  echo %%i >> %OUTPUTFILE%
  dumpbin /LINKERMEMBER "%%i" | findstr /C:"%SEARCHWORD%" >> %OUTPUTFILE%
)
notepad %OUTPUTFILE%

 

使い方は、第一引数にライブラリディレクトリのパス、第二引数に検索したいシンボルを指定します。

linksearch "C:\Program Files\PCL 1.8.1\3rdParty\VTK\lib\*" vtkDebugLeaksManager@@QEAA@XZ

 

この出力結果(flistresult.txt)は、このようになります。

 
.\libx\vtkalglib-8.0-gd.lib
.\libx\vtkalglib-8.0.lib
.\libx\vtkChartsCore-8.0-gd.lib
.\libx\vtkChartsCore-8.0.lib
.\libx\vtkCommonColor-8.0-gd.lib
.\libx\vtkCommonColor-8.0.lib
.\libx\vtkCommonComputationalGeometry-8.0-gd.lib
.\libx\vtkCommonComputationalGeometry-8.0.lib
.\libx\vtkCommonCore-8.0-gd.lib
     33737C6 ??0vtkDebugLeaksManager@@QEAA@XZ
     33737C6 ??1vtkDebugLeaksManager@@QEAA@XZ
     69 ??0vtkDebugLeaksManager@@QEAA@XZ
     69 ??1vtkDebugLeaksManager@@QEAA@XZ
.\libx\vtkCommonCore-8.0.lib
     D16866 ??0vtkDebugLeaksManager@@QEAA@XZ
     D16866 ??1vtkDebugLeaksManager@@QEAA@XZ
     69 ??0vtkDebugLeaksManager@@QEAA@XZ
     69 ??1vtkDebugLeaksManager@@QEAA@XZ
.\libx\vtkCommonDataModel-8.0-gd.lib
.\libx\vtkCommonDataModel-8.0.lib
.\libx\vtkCommonExecutionModel-8.0-gd.lib
.\libx\vtkCommonExecutionModel-8.0.lib
.\libx\vtkCommonMath-8.0-gd.lib
.\libx\vtkCommonMath-8.0.lib
.\libx\vtkCommonMisc-8.0-gd.lib
.\libx\vtkCommonMisc-8.0.lib
.\libx\vtkCommonSystem-8.0-gd.lib

... (以下略)

※行が長くなるので中身を.\libx\に移しています

 

検索対象のvtkDebugLeaksManagerが表れているなら、その上のlib名で定義されています

本当は、必要なファイルだけを表示するなどしたかったのですが、Windowsのbatがよくわからずに断念しました。

 

解説

Microsoft COFF Binary File Dumper (DUMPBIN.EXE) は、COFF (Common Object File Format) 形式のバイナリ ファイルに関する情報を出力します。 DUMPBIN を使うと、COFF オブジェクト ファイル、COFF オブジェクトの標準ライブラリ、実行可能ファイル、およびダイナミック リンク ライブラリ (DLL) の内容を確認できます。

-- DUMPBIN リファレンス

ということで、dumpbinはexe,dll,libの内容を確認するためのツールです。

dumpbinはVisual Studioに入っています。Visual Studioのコマンドプロンプト、例えば「VS 2017用 x64 Native Tools コマンドプロンプト」から起動します。

vs2017console

 

そして、/LINKERMEMBER オプションをつけます。

このオプションは、ライブラリで定義されているパブリック シンボルを出力します。

  -- /LINKERMEMBER

> dumpbin /LINKERMEMBER ファイル名

 

ただしこれだけだと、必要のない情報も全部出力されてしまいます。テキストエディタの検索機能を使ってもいいのですが、せっかくなのでfindstrへパイプします。

findstr /C:"検索したい文字列"

ファイルの中からテキスト文字列を検索する。検索対象のパス指定が無ければ、プロンプトで入力されたテキストまたは別のコマンドからパイプ処理で渡されたテキストを検索する。正規表現の使用ができる。

 -- コマンドプロンプト findstr

 

即ち、目星のついているライブラリに対して、以下のように実行して、標準出力があればよいという事になります。

 

dumpbin /LINKERMEMBER "vtkCommonCore-8.0.lib" | findstr /C:"vtkDebugLeaksManager@@QEAA@XZ"

 

注意として、findstrに渡すシンボル名は大抵の場合、(C++でコンパイルされているなら)C++の命名規則で渡した方が確実のようです。@@とかついたものです。これはリンクエラーに書いてあるものをそのままコピペすればよいという意味です。


あとはこの内容をbatで適切に変えていけば良いと言うことになります。

Windowsのbatは(本当に)よくわからないので、解説出来ません。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: