cmake - find_library - 自定义库位置

时间:2012-08-22 14:28:30

标签: c++ windows cmake

我正在尝试让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”变为“包含”,则可以找到库,但是这样就无法正确处理多个版本?

6 个答案:

答案 0 :(得分:23)

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

例如:

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

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

答案 1 :(得分:13)

我看到有两个人把这个问题提到他们的最爱,所以我会尝试回答适合我的解决方案: 我没有使用查找模块,而是为所有已安装的库编写配置文件。这些文件极其简单,也可用于设置非标准变量。 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 )

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

希望这对其他人有帮助。

答案 2 :(得分:7)

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

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

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

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

答案 3 :(得分:4)

你有一个额外的嵌套级别。 CMAKE将在$CMAKE_PREFIX_PATH/include下搜索标题,在$CMAKE_PREFIX_PATH/libs搜索图书馆。

来自CMAKE documentation

  

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

答案 4 :(得分:4)

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

请注意,cmake会在following folders的任何一个中查找配置文件 其中是CMAKE_PREFIX_PATH中的任何路径,name是您要查找的库的名称

<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

答案 5 :(得分:0)

我遇到过类似的情况。我通过在find_library()

之前添加以下代码解决了这个问题
set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/)

然后它可以找到库位置。