Понимание target_link_libraries - PullRequest
       7

Понимание target_link_libraries

0 голосов
/ 05 сентября 2018

Я новичок в Linux. Я вижу в моем CMakeLists.txt следующее:

  target_link_libraries(app wiringPi
                          serializer
                          iothub_client
                          iothub_client_mqtt_transport
                          umqtt
                          aziotsharedutil
                          ssl
                          crypto
                          curl
                          pthread
                          m
                          ssl
                          crypto)

Мой вопрос / понимание; делая это

  1. Мы говорим инструменту CMake для сборки wiringPi, сериализатора и т. Д. И связи с приложением (исполняемым файлом, созданным в моем коде)?
  2. Где находятся все эти библиотеки?
  3. Когда я делаю ldconfig -p | grep <libraryname>, для вышеуказанных библиотек иногда я нахожу результаты, подобные следующим, а иногда ничего, почему это так?
  4. Является ли target_link_libraries достаточно умным, чтобы искать библиотеки в подкаталоги тоже? Я имею в виду, я вижу, что некоторые просто там под user / lib, а некоторые - еще один уровень, такой как /usr/lib/arm-linux-gnueabihf

pi @ raspberrypi: ~ $ ldconfig -p | grep curl
libcurl.so.4 (libc6, hard-float) => /usr/lib/arm-linux-gnueabihf/libcurl.so.4
libcurl-gnutls.so.4 (libc6, hard-float) => /usr/lib/arm-linux-gnueabihf/libcurl-gnutls.so.4

pi @ raspberrypi: ~ $ ldconfig -p | grep wiringPi
libwiringPiDev.so (libc6, hard-float) => /usr/local/lib/libwiringPiDev.so
libwiringPiDev.so (libc6, hard-float) => /usr/lib/libwiringPiDev.so
libwiringPi.so (libc6, hard-float) => /usr/local/lib/libwiringPi.so
libwiringPi.so (libc6, hard-float) => /usr/lib/libwiringPi.so

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Когда вы передаете target_link_libraries простое имя (не путь), которое не является целью, CMake просто преобразует это имя в флаг компоновщика. Например. в Linux это флаг

-l<library-name>

Так что вопросы о поиске в библиотеке вы можете адресовать непосредственно компоновщику - CMake вне игры здесь.

0 голосов
/ 05 сентября 2018
  1. Мы говорим инструменту CMake для сборки wiringPi, сериализатора и т. Д. И связи с приложением (исполняемым файлом, созданным в моем коде)?

Не совсем. Эта команда сообщает CMake, что библиотеки wiringPi, serializer, и т. Д. должны быть связаны с целевым приложением во время этапа связывания с этой целью. В нем ничего не говорится о создании самих библиотек, и обычно ожидается, что они уже будут доступны, а не созданы.

  1. Где находятся все эти библиотеки?

Может варьироваться. Компилятор имеет список каталогов по умолчанию, в котором он ищет библиотеки. Другие команды CMake могут добавлять параметры ссылок, которые добавляют каталоги в этот список.

  1. Когда я делаю ldconfig -p | grep <libraryname>, для вышеуказанных библиотек иногда я нахожу выходные данные, такие как следующие, а иногда ничего, почему это так?

ldconfig сообщает о библиотеках, известных компоновщику dynamic . Это отличается от компоновщика, который запускается во время компиляции, и каталоги и библиотеки, о которых оба знают, не обязательно совпадают. Причины, по которым ldconfig может не указывать данную библиотеку, включают:

  1. Библиотека не установлена.
  2. Установлена ​​только статическая версия библиотеки.
  3. Библиотека не находится ни в одном месте, которое динамический компоновщик проверяет по умолчанию (дополнительные каталоги могут быть указаны при запуске программы, по крайней мере, двумя различными способами).
  1. Является ли target_link_libraries достаточно умным, чтобы искать библиотеки и в подкаталогах? Я имею в виду, что некоторые из них находятся под user/lib, а некоторые - еще один уровень, например /usr/lib/arm-linux-gnueabihf

Это не функция CMake, а скорее выбранный набор инструментов и его конфигурация (в Linux это часто набор инструментов GNU с GCC). Обычно можно с уверенностью предположить, что набор инструментов использует все правильные стандартные каталоги библиотек по умолчанию. Иногда CMake может быть успешно проинструктирован для поиска определенных библиотек и в других вероятных местах, но target_link_libraries не является частью этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...