Sar Kerson Ответов: 1

Как построить динамическую библиотеку в Linux?


Когда я строю свой проект(Face_test.cpp), мне нужна эта команда:
g++ -std=c++11 -O3 -I.. ../dlib/all/source.cpp -DDLIB_JPEG_SUPPORT -DDLIB_PNG_SUPPORT -ljpeg -lpng -lpthread -lX11 -fPIC -shared -o Face_test.cpp

Но я ожидаю построить его с помощью команды типа:
g++ Face_test.cpp -L. -lFace -o Face_test

а это значит, что мне нужно построить свою библиотеку. Так как же я могу построить свою библиотеку?

Что я уже пробовал:

Я пытался построить свою библиотеку(libFace.so) с помощью команды типа:
g++ -std=c++11 -O3 -I.. ../dlib/all/source.cpp -DDLIB_JPEG_SUPPORT -DDLIB_PNG_SUPPORT -ljpeg -lpng -lpthread -lX11 -fPIC -shared -o libFace.so
и затем,
g++ Face_test.cpp -L. -lFace -o Face_test

но это не сработало, и выдает ошибку вот так:
Face_test.cpp:41:57: fatal error: dlib/image_processing/frontal_face_detector.h: No such file or directory
compilation terminated.

Итак, у меня есть еще один вопрос: почему мне все еще нужен *.h, когда у меня есть *.so?

Может ли кто-нибудь дать мне несколько советов?

1 Ответов

Рейтинг:
10

Jochen Arndt

Процесс создания исполняемого файла состоит из двух этапов:


  1. Скомпилируйте каждый исходный файл для создания соответствующих объектных файлов
  2. Связывание объектных файлов для создания исполняемого файла или библиотеки

Поскольку ваш проект также создает библиотеку, вы должны сделать второй шаг дважды (один раз для библиотеки и один раз для исполняемого файла).

G++ может выполнять оба шага (компиляцию и связывание) с помощью одной команды. Обычно это делается с помощью небольших сборок, содержащих только один или несколько исходных файлов. Каждый процесс (компиляция и связывание) имеет свой собственный набор параметров командной строки для конкретного процесса.

Ошибка
Face_test.cpp:41:57: fatal error: dlib/image_processing/frontal_face_detector.h: No such file or directory
compilation terminated.
возникает при компиляции исходного файла Face_test.cpp. Он говорит вам, что включаемый файл из сообщения не может быть найден. Это не связано ни с какой библиотекой, потому что это произошло во время компиляции (а не связывания).

Зная теперь о двух шагах сборки вы должны ознакомиться с соответствующими опциями (Вызов GCC-использование коллекции компиляторов GNU (GCC)[^]).

Если ваша первая команда (компиляция файла source.cpp и связывание его для создания общей библиотеки libFace.так) успешно, вы должны скомпилировать файл Face_test.cpp и свяжите сгенерированный объектный файл с вашей библиотекой, чтобы сгенерировать исполняемый файл. Но командование
g++ Face_test.cpp -L. -lFace -o Face_test
не содержал никаких параметров компиляции, как в ваших предыдущих вызовах. Так что просто добавьте их:
g++ -std=c++11 -O3 -I.. Face_test.cpp -L. -lFace -o Face_test

Я не знаю вашей настройки, так что, возможно, потребуется добавить больше опций (например, -I../dlib/image_processing что, безусловно, должно избежать ошибки).


Sar Kerson

Большое вам спасибо! Я просто использовал команду: g++ - std=c++11-O3-I.. Face_test.cpp -L.-lFace-o Face_test
И это действительно сработало!

Jochen Arndt

Спасибо Вам за ваши отзывы.

Вы можете принять мое решение, чтобы оно было помечено как решенное.