CMake';s find_库找不到没有版本、扩展名和库前缀的库
我试图链接到一个系统库:CMake';s find_库找不到没有版本、扩展名和库前缀的库,cmake,Cmake,我试图链接到一个系统库:/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}") el
/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()
(也尝试了查找库(TCMALLOC\u LIB TCMALLOC)
)
我明白了
而如果我有
find_library(TCMALLOC_LIB NAMES libtcmalloc.so.4)
一切正常:Found TCMALLOC_LIB:/usr/LIB/x86_64-linux-gnu/libtcmalloc.so.4
我做错什么了吗?为什么我需要精确地指定文件名?如何调试查找\u库
?更新-真正原因
正如@Tsyvarev在评论中提到的,结果是cmake找不到库,因为我只是“部分”安装了它,应该已经安装了-dev
版本(libgoogle perftools dev
)
TL;博士 事实证明,
tcmalloc
不是一个常规的库,也就是说,它没有libtcmalloc.so
symlink指向.so.4
,这就是为什么cmake找不到它
如何调试查找\u库
?
我找到了一种通过strace
调试find_library
的方法:
$ 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>
...
我们将看到它确实安装了。因此symlink,而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
“我做错什么了吗?”-像往常一样,对于使用库的创建应用程序,您需要安装适当的-dev
包,该包提供libtcmalloc.so
symlink和头文件。您完全正确,我想-dev
库应该作为libgoogle-perftools4
的依赖项安装,但事实并非如此。我会更新我的答案。谢谢我知道我参加聚会迟到了,但为了以防万一,这可能对某人有用:我有一个类似的问题(与开发包无关),我用SET(CMAKE_FIND_LIBRARY_后缀“)解决了它我在这个答案中发现:我在OSX中也有同样的问题,我确实用brew安装gperftools
安装了gperftools,cmake给了我found GooglePerfTools:/usr/local/lib/libtcmalloc.dylib
,但我的make没有说ld:library not found for-ltcmalloc
我能做什么?
# 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
# locate tcmalloc | grep "\.so"
/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.3.0