62

我目前正在尝试让 CMake 为我的项目运行(在 Windows 上)。我想使用安装所有库的自定义位置。为了向 CMake 告知该路径,我尝试这样做:

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs)

但是当我试图找到图书馆时

find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static)

CMake 找不到它。当我将前缀路径设置为

set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl)

...图书馆位于。

所以我的问题是:如何正确配置 CMake 以在自定义位置使用目录结构,如下所示:

D:/develop/cmake/libs/
-> libA
   -> include
   -> lib
-> libB
   -> include
   -> lib
-> ...
   -> include
   -> lib

在“include”中是公共头文件,在“lib”中是编译的库。

希望有人可以帮助我 - 在此先感谢

编辑:我目前的解决方法是,在我搜索库之前执行此操作:

set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs)
file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*)
foreach(dir ${sub-dir})
    if(IS_DIRECTORY ${dir})
        set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir})
    endif()
endforeach()

但是那样boost的默认模块直到它才会找到它,因为boost的目录结构有点不同。

boost -> include -> boost-1_50 -> *.hpp

当我移动内容时,如果可以找到“boost-1_50”以“包含”该库,但这样就不可能处理多个版本,对吧?

4

6 回答 6

33

最简单的解决方案可能是添加HINTS到每个find_*请求。

例如:

find_library(CURL_LIBRARY
    NAMES curl curllib libcurl_imp curllib_static
    HINTS "${CMAKE_PREFIX_PATH}/curl/lib"
)

对于 Boost,我强烈建议使用FindBoost标准模块并将BOOST_DIR变量设置为指向您的 Boost 库。

于 2012-08-23T07:50:12.927 回答
18

我看到有两个人把这个问题放到了他们的最爱中,所以我将尝试回答对我有用的解决方案:我没有使用查找模块,而是为所有已安装的库编写配置文件。这些文件非常简单,也可用于设置非标准变量。CMake 将(至少在 Windows 上)在

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake

(可以通过环境变量设置)。因此,例如升压配置在路径中

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake

在该配置中,您可以设置变量。我的 boost 配置文件如下所示:

set(boost_INCLUDE_DIRS ${boost_DIR}/include)
set(boost_LIBRARY_DIR ${boost_DIR}/lib)
foreach(component ${boost_FIND_COMPONENTS}) 
    set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-gd-1_50.lib)
    set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib)
endforeach()
add_definitions( -D_WIN32_WINNT=0x0501 )

非常简单 + 当您编写一些辅助函数时,可以进一步缩小配置文件的大小。我对这个设置的唯一问题是我没有找到一种方法让配置文件优先于查找模块 - 所以你需要删除查找模块。

希望这对其他人有帮助。

于 2012-09-29T22:43:45.807 回答
9

通过添加多个路径来使用 CMAKE_PREFIX_PATH(用分号分隔,没有空格)。您可以将其设置为环境变量,以避免在您的 cmake 配置文件中包含绝对路径

请注意,cmake 将在以下任何文件夹中查找配置文件, 其中 CMAKE_PREFIX_PATH 中的任何路径和名称是您要查找的库的名称

<prefix>/                                               (W)
<prefix>/(cmake|CMake)/                                 (W)
<prefix>/<name>*/                                       (W)
<prefix>/<name>*/(cmake|CMake)/                         (W)
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/          (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/                (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (U)

在您的情况下,您需要将以下两个路径添加到 CMAKE_PREFIX_PATH :

D:/develop/cmake/libs/libA;D:/develop/cmake/libB
于 2015-01-20T07:53:58.273 回答
7

您有一层额外的嵌套。CMAKE 将搜索$CMAKE_PREFIX_PATH/include标题和$CMAKE_PREFIX_PATH/libs库。

来自 CMAKE文档

对于 CMAKE_PREFIX_PATH 列表中的每个路径,CMake 将在 FIND_PATH() 被调用时检查“PATH/include”和“PATH”,在 FIND_PROGRAM() 被调用时检查“PATH/bin”和“PATH”,以及“PATH/lib 和” PATH" 当 FIND_LIBRARY() 被调用时。

于 2013-10-28T14:36:01.343 回答
7

无法以您想要的方式自动设置CMAKE_PREFIX_PATH。我看到以下解决此问题的方法:

  1. 将所有库文件放在同一个目录中。也就是说,include/将包含所有库的标头,lib/- 二进制文件等。仅供参考,这是大多数类 UNIX 系统的常见布局。

  2. 将全局环境变量设置CMAKE_PREFIX_PATHD:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;.... 当你运行 CMake 时,它​​会自动获取这个 env var 并填充它自己的CMAKE_PREFIX_PATH.

  3. 编写一个包装器 .bat 脚本,该脚本将使用参数调用cmake命令。-D CMAKE_PREFIX_PATH=...

于 2012-08-23T11:52:19.240 回答
-2

我遇到过类似的情况。我通过在之前添加以下代码解决了这个问题find_library()

set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/)

然后它可以找到图书馆的位置。

于 2013-07-25T14:17:57.147 回答