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_'
いくつかの必要な-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-dev
、libblas-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(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-dev
とlibblas-dev
がインストールされていない場合、それらをインストールすることをお勧めします。もしそうなら、私はそれを行うことをお勧めします-あなたのために、あなたはより良いパフォーマンスを得るかもしれません-そして、Dlibビルドをもう一度やり直してください。
これを行うと同じエラーが発生する場合、または異なるエラーが発生する場合は、質問を詳細情報で更新してください。