CMake find_library не может найти библиотеку без версии, расширения и префикса lib - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь создать ссылку на системную библиотеку: /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4, когда у меня есть этот CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(all)

find_library(TCMALLOC_LIB NAMES tcmalloc)
if(TCMALLOC_LIB)
   message("Found TCMALLOC_LIB: ${TCMALLOC_LIB}")
else()
   message(FATAL_ERROR "TCMALLOC_LIB library not found")
endif()

(также пытался find_library(TCMALLOC_LIB tcmalloc))

Я получаю

CMake Error at CMakeLists.txt:13 (message):
  TCMALLOC_LIB library not found

Хотя, если у меня

find_library(TCMALLOC_LIB NAMES libtcmalloc.so.4)

все хорошо: Found TCMALLOC_LIB: /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4

Я что-то не так делаю?Почему мне нужно точно указать имя файла?Как я могу отладить find_library?

1 Ответ

1 голос
/ 03 июля 2019

Обновление - Реальная причина

Как упомянул @Tsyvarev в комментарии, оказывается, что cmake не смог найти библиотеку, потому что я установил ее только "частично", должна быть установлена ​​версия -dev (libgoogle-perftools-dev).


TL; DR

Что ж, получается, что tcmalloc не является обычной / обычной библиотекой, а именно, у нее нет символьной ссылки libtcmalloc.so, указывающей на .so.4, поэтому cmake не может ее найти.

Как мне отладить find_library?

Я нашел способ отладки find_library через strace:

$ rm -rf ./* && strace cmake ../scripts/ 2>&1 | grep tcmalloc
access("/usr/local/nvidia/bin/libtcmalloc.so", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/local/cuda/bin/libtcmalloc.so", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/local/sbin/libtcmalloc.so", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/local/bin/libtcmalloc.so", R_OK) = -1 ENOENT (No such file or directory)
...
<many lines skipped>
...

Из этого strace вывода мы видим, что cmake, действительно, пытается добавить lib и добавить .so, но не пытается добавить ни одну версию.

Теперь, если мы посмотрим на другую "обычную" библиотеку:

# locate protobuf | grep "\.so"
/usr/lib/x86_64-linux-gnu/libprotobuf.so
/usr/lib/x86_64-linux-gnu/libprotobuf.so.17
/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0

мы увидим, что он устанавливает .so символическую ссылку, а tcmalloc не делает:

# locate tcmalloc | grep "\.so"
/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...