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 comDLIB_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.