Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake';s find_库找不到没有版本、扩展名和库前缀的库_Cmake - Fatal编程技术网

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