Como eu compilo face_landmark_detection_ex, que requer dlib?

1

Eu tenho este código para um programa chamado face_landmark_detection_ex . Não há makefile.

Como posso descobrir qual comando eu preciso digitar, no Ubuntu, para produzir um executável que eu possa executar?

Eu tentei compilá-lo com:

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

Mas isso retornou:

   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

E uma tonelada de erros como:

   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 \
     ^

... e assim por diante.

Eu já fiz: sudo apt install libdlib-dev

Atualizar

Mais tarde, tentei executar:

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

Mas isso não parece funcionar. Ele produziu esses erros "referência indefinida" , inclusive para símbolos no namespace dlib . Os erros completos estão no pastebin; aqui estão as primeiras linhas:

$ 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_'
    
por gihidoma 27.07.2017 / 17:06

1 resposta

1

Você pode estar omitindo alguns -l sinalizadores obrigatórios ou pode estar vinculando-se à versão incorreta do dlib.

Além de -ldlib , você também precisa de -llapack , -lblas e -lgif .

Isso funciona para mim no Ubuntu 16.04 LTS:

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

A saída mostrada na sua pergunta indica que, quando você tentou criar o programa, foram encontrados arquivos de cabeçalho em /usr/local/include/dlib . Este não é o lugar onde o pacote libdlib-dev coloca seus arquivos de cabeçalho, então a versão do dlib que você instalou, 19.4, é a que está sendo usada.

  • Isso provavelmente é bom. Não só é mais recente, mas eu acredito que o face_landmark_detection_ex é incompatível com o dlib do Ubuntu porque ele é compilado com DLIB_NO_GUI_SUPPORT .
  • Se você não estiver usando a versão do dlib fornecida por libdlib-dev e suas dependências, recomendo desinstalá-las (veja abaixo).

O Dlib é usado às vezes sem ser instalado, mas parece que você o instalou em /usr/local , talvez com um método como o dado no passo 3.1 aqui . Supondo que você executou sudo ldconfig após instalá-lo e que os pacotes liblapack-dev , libblas-dev e libgif-dev estão instalados, passar -llapack -lblas -ldlib -lgif para o compilador deverá produzir uma construção bem-sucedida:

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

Você pode querer passar outros sinalizadores para o compilador para habilitar avisos e (como os comentários do código-fonte mencionam) otimizações.

Eu tentei omitir várias combinações de sinalizadores para obter erros diferentes, mas não consegui produzir os erros de linker específicos que você obteve , então talvez mais esteja acontecendo aqui.

Desinstalando o Dlib Fornecido pelo Sistema

Para garantir que a versão mais antiga do dlib (de quando você instalou libdlib-dev ) não esteja interferindo, bem como para evitar confusão, sugiro desinstalá-la. Um problema que isso pode ajudar a resolver é a possibilidade de o compilador estar usando cabeçalhos para a versão do dlib que você instalou, mas o vinculador está usando a versão da biblioteca fornecida pelo sistema . Eles não são compatíveis um com o outro.

Supondo que você instalou o dlib fornecido pelo sistema executando sudo apt install libdlib-dev e nenhum outro software do Ubuntu está dependendo, estes comandos irão desinstalá-lo:

sudo apt remove libdlib-dev
sudo apt autoremove

O pacote -dev fornece apenas os arquivos de cabeçalho, mas faz com que a própria biblioteca seja instalada como uma dependência; a ação autoremove remove pacotes que são instalados apenas para satisfazer dependências de outros pacotes que foram removidos desde então.

Se depois disso as dependências não estiverem todas instaladas, você poderá adicioná-las novamente. Por exemplo, você pode ter que executar isso:

sudo apt install liblapack-dev libblas-dev libgif-dev

(Se desejar, você pode fazer isso primeiro, antes de remover pacotes, marcá-los como instalados manualmente e impedir que sejam removidos).

Em seguida, sugiro desinstalar e reinstalar a versão do dlib que você instalou manualmente, embora a execução de sudo ldconfig novamente possa ser suficiente, se a versão instalada não estiver quebrada. Pode até não ser necessário, mas não deve causar danos.

Um benefício de reconstruir e reinstalar o dlib é que você provavelmente será informado se algumas de suas dependências não estiverem mais satisfeitas.

Quando você instala o Dlib novamente, ele pode fornecer a opção de usar sua própria versão interna de uma biblioteca da qual depende ou instalar a biblioteca fornecida pelo sistema. Por exemplo, se liblapack-dev e libblas-dev não estiverem instalados, pode sugerir que você os instale. Em caso afirmativo, recomendo fazer isso - por exemplo, você pode obter um melhor desempenho - e iniciar a compilação do Dlib novamente.

Se você fizer isso e receber os mesmos erros - ou diferentes -, atualize sua pergunta com mais informações.

    
por Eliah Kagan 27.07.2017 / 23:04