调试CMake find_library

时间:2018-03-22 14:33:36

标签: cmake

是否可以从CMake调试find_library

我想要的是一个考虑路径的列表。我的用例是:

我有一个电话
find_library (FOO_LIBRARY NAMES foo foo.so.0 )

我的系统上有/lib64/libfoo.so.0。但是CMake没有找到它。

我检查FIND_LIBRARY_USE_LIB64_PATHS设置为TRUE

附带问题:我认为CMake默认会查看/lib。但是,我无法找到明确的参考。 https://cmake.org/cmake/help/v3.0/command/find_library.html表示会搜索<prefix>/lib for each <prefix> in CMAKE_PREFIX_PATH,因此会减少为&#34;是否考虑空前缀?&#34;

我应该简单地添加PATHS /lib吗?

最后注意事项:我对调试CMake感兴趣,以帮助我解决此类问题。解决手头的问题是一个特别的好处,如果这个&#34;调试&#34;不可能。此调试应来自INSIDE CMake,例如通过设置变量或标志。所以不要使用gdb和CMake本身的调试版本。

2 个答案:

答案 0 :(得分:8)

使用CMake 3.17,got added

引入了“ CMAKE_FIND_DEBUG_MODE”变量以打印更多内容 查找cmake运行到标准错误期间的呼叫信息。输出量 是供人食用而不是用于分析的。

因此,您将-DCMAKE_FIND_DEBUG_MODE=true--debug-find传递给CMake命令。

以下是搜索libFOO时的示例输出:

find_library considered the following locations:

/usr/local/lib64/(lib)FOO(\.so|\.a)
/usr/local/lib/(lib)FOO(\.so|\.a)
/usr/local/lib64/(lib)FOO(\.so|\.a)
/usr/local/lib/(lib)FOO(\.so|\.a)
/usr/local/lib64/(lib)FOO(\.so|\.a)
/usr/local/(lib)FOO(\.so|\.a)
/usr/lib64/(lib)FOO(\.so|\.a)
/usr/lib/(lib)FOO(\.so|\.a)
/usr/lib64/(lib)FOO(\.so|\.a)
/usr/lib/(lib)FOO(\.so|\.a)
/usr/lib64/(lib)FOO(\.so|\.a)
/usr/(lib)FOO(\.so|\.a)
/lib64/(lib)FOO(\.so|\.a)
/lib/(lib)FOO(\.so|\.a)
/opt/(lib)FOO(\.so|\.a)

The item was not found.

答案 1 :(得分:2)

我知道这不是一个完整的答案,但是我遇到了同样的问题,并发现有必要在CMake源代码中向find_library添加调试日志记录。我提交了pull request(正在进行中)以将其添加到主流CMake中。

如果find_library失败,我会通过记录一条错误消息并提供一些相关的详细信息来消除一些可能的错误源,例如:

    set(libssl_names
            ssl${_OPENSSL_MSVC_ARCH_SUFFIX}${_OPENSSL_MSVC_RT_MODE}
            ssl${_OPENSSL_MSVC_RT_MODE}
            ssl
            ssleay32${_OPENSSL_MSVC_RT_MODE}
            ssleay32
    )

    find_library(SSL_EAY_DEBUG
            NAMES ${libssl_names}
            NAMES_PER_DIR
            PATHS ${OPENSSL_ROOT_DIR}
            PATH_SUFFIXES ${_OPENSSL_PATH_SUFFIXES}
            NO_DEFAULT_PATH
    )

    if(NOT SSL_EAY_DEBUG)
            message(FATAL_ERROR "OPENSSL_ROOT_DIR is set to '${OPENSSL_ROOT_DIR}', but did not find any file matching ${OPENSSL_ROOT_DIR}/{${_OPENSSL_PATH_SUFFIXES}}/${CMAKE_FIND_LIBRARY_PREFIXES}{${libssl_names}}${CMAKE_FIND_LIBRARY_SUFFIXES}")
    endif()

输出类似:

CMake Error at CMakeLists.txt:526 (message):
  OPENSSL_ROOT_DIR is set to '../../Install/openssl/', but did not find any
  file matching
  ../../Install/openssl//{lib/VC/static;VC/static;lib}/lib{ssl64MT;sslMT;ssl;ssleay32MT;ssleay32}.a

除了上述模式的{花括号}部分中的分号(而不是逗号)和正则表达式(如果配置了多个CMAKE_FIND_LIBRARY_SUFFIXES)(例如Windows上的.lib .a),这是将Shell扩展为路径列表,您可以将其传递给ls来检查它们的存在:

$ ls ../../Install/openssl//{lib/VC/static,VC/static,lib}/lib{ssl64MT,sslMT,ssl,ssleay32MT,ssleay32}.a
ls: ../../Install/openssl//VC/static/libssl.a: No such file or directory
ls: ../../Install/openssl//VC/static/libssl64MT.a: No such file or directory
ls: ../../Install/openssl//VC/static/libsslMT.a: No such file or directory
ls: ../../Install/openssl//VC/static/libssleay32.a: No such file or directory
ls: ../../Install/openssl//VC/static/libssleay32MT.a: No such file or directory
ls: ../../Install/openssl//lib/VC/static/libssl.a: No such file or directory
ls: ../../Install/openssl//lib/VC/static/libssl64MT.a: No such file or directory
ls: ../../Install/openssl//lib/VC/static/libsslMT.a: No such file or directory
ls: ../../Install/openssl//lib/VC/static/libssleay32.a: No such file or directory
ls: ../../Install/openssl//lib/VC/static/libssleay32MT.a: No such file or directory
ls: ../../Install/openssl//lib/libssl64MT.a: No such file or directory
ls: ../../Install/openssl//lib/libsslMT.a: No such file or directory
ls: ../../Install/openssl//lib/libssleay32.a: No such file or directory
ls: ../../Install/openssl//lib/libssleay32MT.a: No such file or directory
../../Install/openssl//lib/libssl.a

(至少对我来说)不明显:

  • 相对路径(例如上面的../../Install)实际上是相对于原始源目录(不是当前项目的构建目录,CMake称为CMAKE_BINARY_DIR。)(因此,您应运行{{1 }},而不是您的构建目录。

  • FIND_LIBRARY_USE_LIB64_PATHS(默认情况下通常为开)会导致原始路径被损坏的路径(lib-> lib64)替换(不仅由其他搜索路径补充,而且已完全替换)。 / p>

  • FIND_LIBRARY_USE_LIB32_PATHS之类的其他甚至鲜为人知的属性也会导致类似的错误处理(lib-> lib32)。

  • 可以使用ls禁用此重整。