ぬの部屋(仮)
nu-no-he-ya
  •    1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • 必要な関数やクラスを.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は(本当に)よくわからないので、解説出来ません。