在 cmakefind_library函数的文档中,我们有
CMake 变量 CMAKE_FIND_ROOT_PATH 指定一个或多个目录以添加到所有其他搜索目录之前。这有效地“重新植根”了给定位置下的整个搜索。作为 CMAKE_STAGING_PREFIX 后代的路径被排除在重新生根之外,因为该变量始终是主机系统上的路径。默认情况下 CMAKE_FIND_ROOT_PATH 为空。
CMAKE_SYSROOT 变量也可用于指定一个目录作为前缀。设置 CMAKE_SYSROOT 也有其他效果。有关更多信息,请参阅该变量的文档。
这些变量在交叉编译指向目标环境的根目录时特别有用,CMake 也会在那里搜索。默认情况下,首先搜索 CMAKE_FIND_ROOT_PATH 中列出的目录,然后搜索 CMAKE_SYSROOT 目录,然后搜索非根目录。可以通过设置 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 来调整默认行为。可以在每次调用的基础上手动覆盖此行为。通过使用 CMAKE_FIND_ROOT_PATH_BOTH,搜索顺序将如上所述。如果使用 NO_CMAKE_FIND_ROOT_PATH,则不会使用 CMAKE_FIND_ROOT_PATH。如果使用 ONLY_CMAKE_FIND_ROOT_PATH,则仅搜索根目录和 CMAKE_STAGING_PREFIX 下的目录。
(见http://www.cmake.org/cmake/help/v3.0/command/find_library.html)
我不确定你是怎么读的,但对我来说,这似乎暗示find_library将用于CMAKE_FIND_ROOT_PATH查找库。我写了以下内容cmakelists.txt:
cmake_minimum_required( VERSION 3.0 )
project( "cmakefindlibtest" )
message( "CMAKE_FIND_ROOT_PATH is ${CMAKE_FIND_ROOT_PATH}" )
list( APPEND CMAKE_FIND_ROOT_PATH "C:/DEV/lib/" )
message( "CMAKE_FIND_ROOT_PATH is now ${CMAKE_FIND_ROOT_PATH}" )
#find_library( punycode_library_test punycode PATHS "C:/DEV/lib" )
find_library( punycode_library_test punycode )
message( "punycode_library_test is now ${punycode_library_test}" )
add_executable( cmakefindlibtest main.cpp )
target_link_libraries( cmakefindlibtest ${punycode_library_test} )
Run Code Online (Sandbox Code Playgroud)
main.cpp只是你好世界。在 中C:\DEV\lib,我放置了一个名为punycode.lib(这是在 Windows 上)的库。我已经指向CMAKE_FIND_ROOT_PATH了目录。然后当我打电话时find_library,我得到:
c:\DEV\cmakefindtest\_build>cmake ..
-- Building for: Visual Studio 11 2012
CMAKE_FIND_ROOT_PATH is
CMAKE_FIND_ROOT_PATH is now C:/DEV/lib/
punycode_library_test is now punycode_library_test-NOTFOUND
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
punycode_library_test
linked by target "cmakefindlibtest" in directory C:/DEV/cmakefindtest
-- Configuring incomplete, errors occurred!
See also "C:/DEV/cmakefindtest/_build/CMakeFiles/CMakeOutput.log".
Run Code Online (Sandbox Code Playgroud)
请注意,当我将目录添加到find_library's 调用的 PATHS 部分时
find_library( punycode_library_test punycode PATHS "C:/DEV/lib" )
Run Code Online (Sandbox Code Playgroud)
一切正常:
c:\DEV\cmakefindtest\_build>cmake ..
-- Building for: Visual Studio 11 2012
CMAKE_FIND_ROOT_PATH is
CMAKE_FIND_ROOT_PATH is now C:/DEV/lib/
punycode_library_test is now C:/DEV/lib/punycode.lib
-- Configuring done
-- Generating done
-- Build files have been written to: C:/DEV/cmakefindtest/_build
Run Code Online (Sandbox Code Playgroud)
所以find_library只是不使用CMAKE_FIND_ROOT_PATH?
更新:
看起来 CMAKE_LIBRARY_PATH 主要做我想要它在这里做的事情,并且根据http://public.kitware.com/pipermail/cmake-developers/2012-January/002850.html,看起来这就是我应该使用的无论如何,在这种情况下。
但是,我仍在试图弄清楚为什么CMAKE_FIND_ROOT_PATH不能使用find_library. http://www.cmake.org/Wiki/CMake_Cross_Compiling 上的文档说CMAKE_FIND_ROOT_PATH,
这是一个目录列表,列出的每个目录都将添加到每个 FIND_XXX() 命令的每个搜索目录之前。
在这种情况下,这似乎不是真的,除非我错过了某种设置或其他变量。
首先,将被添加到find_library 文档CMAKE_FIND_ROOT_PATH中描述的一组特定目录中。它不会添加到您为 指定的文件名之前。find_library
您只需要用于CMAKE_FIND_ROOT_PATH交叉编译。例如, while find_library(.. jpeg ...)will find你可以用find/usr/lib/libjpeg.so 来劫持这个搜索。set(CMAKE_FIND_ROOT_PATH ~/my_toolchain)~/my_toolchain/usr/lib/libjpeg.so
由于您没有提到您正在交叉编译,因此您可能需要的是CMAKE_PREFIX_PATH. 尝试set(CMAKE_PREFIX_PATH "c:/DEV")或在 中set(CMAKE_LIBRARY_PATH "c:/DEV/lib")进行find_library搜索c:/DEV/lib。
| 归档时间: |
|
| 查看次数: |
13972 次 |
| 最近记录: |