web-dev-qa-db-ja.com

dlibを必要とするface_landmark_detection_exをコンパイルするにはどうすればよいですか?

face_landmark_detection_exと呼ばれるプログラムの このコード が与えられます。メイクファイルはありません。

実行可能な実行可能ファイルを生成するために、Ubuntuで入力する必要があるコマンドを見つけるにはどうすればよいですか?

私はそれをコンパイルしようとしました:

 g++ face_landmark_detection_ex.cpp  -o face $(pkg-config --cflags --libs dlib)

しかし、それは返されました:

   Package dlib was not found in the pkg-config search path.
   Perhaps you should add the directory containing `dlib.pc'
   to the PKG_CONFIG_PATH environment variable

そして、次のような大量のエラー:

   No package 'dlib' found
   In file included from /usr/local/include/dlib/geometry/rectangle.h:7:0,
                    from /usr/local/include/dlib/geometry.h:6,
                    from /usr/local/include/dlib/image_processing/object_detector.h:7,
                    from /usr/local/include/dlib/image_processing/frontal_face_detector.h:7,
                    from face_landmark_detection_ex.cpp:41:
   /usr/local/include/dlib/algs.h:17:10: error: #error "Dlib requires C++11 support.  Give your compiler the               -std=c++11 option to enable it."
            #error "Dlib requires C++11 support.  Give your compiler the -std=c++11
             ^
   In file included from /usr/include/c++/5/array:35:0,
                    from /usr/local/include/dlib/serialize.h:150,
                    from /usr/local/include/dlib/geometry/rectangle.h:10,
                    from /usr/local/include/dlib/geometry.h:6,
                    from /usr/local/include/dlib/image_processing/object_detector.h:7,
                    from /usr/local/include/dlib/image_processing/frontal_face_detector.h:7,
                    from face_landmark_detection_ex.cpp:41:
   /usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support        for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler               options.
    #error This file requires compiler and library support \
     ^

...など。

すでにやった:Sudo apt install libdlib-dev

更新

後で、実行してみました:

g++ face_landmark_detection_ex.cpp -l dlib -std=c++11 -o main

しかし、それはうまくいかないようでした。 dlib名前空間のシンボルを含む、これらの "undefined reference" エラーを生成しました。完全なエラーはPastebinにあります。最初の数行は次のとおりです。

$ g++ face_landmark_detection_ex.cpp -l dlib -std=c++11 -o main
/tmp/ccY36F7N.o: In function `main':
face_landmark_detection_ex.cpp:(.text+0x15e): undefined reference to `dlib::image_window::image_window()'
face_landmark_detection_ex.cpp:(.text+0x16d): undefined reference to `dlib::image_window::image_window()'
face_landmark_detection_ex.cpp:(.text+0x431): undefined reference to `dlib::image_window::clear_overlay()'
face_landmark_detection_ex.cpp:(.text+0x4a1): undefined reference to `dlib::image_window::add_overlay(std::vector<dlib::image_display::overlay_line, std::allocator<dlib::image_display::overlay_line> > const&)'
face_landmark_detection_ex.cpp:(.text+0x5e3): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x5f2): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x773): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x78a): undefined reference to `dlib::image_window::~image_window()'
/tmp/ccY36F7N.o: In function `dlib::lapack::binding::gesdd(char, int, int, double*, int, double*, double*, int, double*, int, double*, int, int*)':
face_landmark_detection_ex.cpp:(.text._ZN4dlib6lapack7binding5gesddEciiPdiS2_S2_iS2_iS2_iPi[_ZN4dlib6lapack7binding5gesddEciiPdiS2_S2_iS2_iS2_iPi]+0x91): undefined reference to `dgesdd_'
1
gihidoma

いくつかの必要な-lフラグを省略するか、dlibの間違ったバージョンに対してリンクしている可能性があります。

-ldlibの他に、-llapack-lblas、および-lgifも必要です。

これは、Ubuntu 16.04 LTSで動作します。

g++ -std=c++11 -o face_landmark_detection_ex face_landmark_detection_ex.cpp -llapack -lblas -ldlib -lgif

質問に示されている出力は、プログラムをビルドしようとしたときに、/usr/local/include/dlibのヘッダーファイルが見つかったことを示しています。これはlibdlib-devパッケージがヘッダーファイルを置く場所ではないため、自分でインストールしたdlibのバージョン19.4が使用されています。

  • それはおそらく良いことです。新しいだけでなく、face_landmark_detection_exは、DLIB_NO_GUI_SUPPORTでコンパイルされているため、Ubuntuのdlibと互換性がないと思います。
  • libdlib-devが提供するバージョンのdlibとその依存関係を使用していない場合は、それらをアンインストールすることをお勧めします(以下を参照)。

Dlibはインストールせずに使用されることもありますが、/usr/localにインストールしたようです。おそらく ステップ3.1で指定したもの のようなメソッドを使用しています。インストール後にSudo ldconfigを実行し、liblapack-devlibblas-dev、およびlibgif-devパッケージがインストールされていると仮定すると、-llapack -lblas -ldlib -lgifをコンパイラーに渡すとビルドが成功します。

ek@Io:~/src$ g++ -std=c++11 -o face_landmark_detection_ex face_landmark_detection_ex.cpp -llapack -lblas -ldlib -lgif
ek@Io:~/src$ ./face_landmark_detection_ex
Call this program like this:
./face_landmark_detection_ex shape_predictor_68_face_landmarks.dat faces/*.jpg

You can get the shape_predictor_68_face_landmarks.dat file from:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

警告と(ソースコードのコメントにあるように)最適化を有効にするために、コンパイラに他のフラグを渡すことができます。

フラグのさまざまな組み合わせを省略してさまざまなエラーを取得しようとしましたが、 特定のリンカーエラー を生成できなかったので、おそらくここでさらに進んでいます。

システム提供のDlibのアンインストール

古いバージョンのdlib(libdlib-devをインストールしたときから)が干渉しないように、混乱を防ぐために、アンインストールすることをお勧めします。これが解決するのに役立つ問題の1つは、コンパイラがインストールしたdlibバージョンのヘッダーを使用しているが、リンカーがシステム提供のライブラリバージョンを使用している可能性があることです。それらは互いに互換性がありません。

Sudo apt install libdlib-devを実行してシステム提供のdlibをインストールし、他のUbuntuソフトウェアがそれに依存していないと仮定すると、これらのコマンドはそれをアンインストールします。

Sudo apt remove libdlib-dev
Sudo apt autoremove

-devパッケージはヘッダーファイルのみを提供しますが、ライブラリ自体が依存関係としてインストールされます。 autoremoveアクションは、削除された他のパッケージの依存関係を満たすためだけにインストールされたパッケージを削除します。

この後、依存関係がすべてインストールされていない場合は、それらを再度追加できます。たとえば、これを実行する必要がある場合があります。

Sudo apt install liblapack-dev libblas-dev libgif-dev

(必要に応じて、パッケージを削除する前に最初にそれを行って、手動でインストールされたものとしてマークし、そもそも削除されないようにすることができます。)

次に、手動でインストールしたバージョンのdlibをアンインストールして再インストールすることをお勧めしますが、インストールしたバージョンがまったく壊れていない場合は、Sudo ldconfigを再度実行するだけで十分かもしれません。必要ではないかもしれませんが、害を及ぼすべきではありません。

Dlibの再構築と再インストールの利点の1つは、依存関係の一部が満たされなくなった場合に通知される可能性があることです。

Dlibを再度インストールすると、依存するライブラリの独自の組み込みバージョンを使用するオプション、またはシステム提供のライブラリをインストールするオプションが表示される場合があります。たとえば、liblapack-devlibblas-devがインストールされていない場合、それらをインストールすることをお勧めします。もしそうなら、私はそれを行うことをお勧めします-あなたのために、あなたはより良いパフォーマンスを得るかもしれません-そして、Dlibビルドをもう一度やり直してください。

これを行うと同じエラーが発生する場合、または異なるエラーが発生する場合は、質問を詳細情報で更新してください。

1
Eliah Kagan