cmake的 - find_library - 自定义库的位置(cmake - find_lib

2019-06-27 06:39发布

目前,我试图让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的正确与在它看起来像一个自定义位置的目录structore工作:

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

在“包括”骗公众头和“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()

但是这种方式对于提升默认模块不会找到它,直到它,因为提升的目录structore是一个有点不同。

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

当我移动如果“刺激-1_50”的内容为“包括”图书馆可以找到,但这种方式是无法正确处理多个版本?

Answer 1:

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

例如:

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

为了加速我会强烈建议使用FindBoost标准模块,并设置BOOST_DIR变量指向您的Boost库。



Answer 2:

只见那两个人把这个问题给他们的最爱,所以我会尽量回答这对我的作品的解决办法:不要使用查找模块我写的配置文件,这是安装的所有库。 这些文件是简单的极端,也可以用来设定非标准的变量。 CMake的将(至少在Windows上)搜索在那些配置文件

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

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

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

在这种配置中,您可以设置变量。 为提高我的配置文件看起来像这样:

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 )

当你写了一些辅助功能,相当直截了当+有可能缩水的配置文件的大小,甚至更多。 我有此设置唯一的问题是,我没有带发现了一个方法,让配置文件在查找模块优先 - 所以你需要删除查找模块。

希望这这是其他人的帮助。



Answer 3:

有没有办法来自动设置CMAKE_PREFIX_PATH你想要的方式。 我看到下面的方法来解决这个问题:

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

  2. 设置全局环境变量CMAKE_PREFIX_PATHD:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;... 。 当您运行CMake的,它会aautomatically捡起这个的环境变量和填充它自己的CMAKE_PREFIX_PATH

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



Answer 4:

你有嵌套的一个额外水平。 CMake的将搜索下$CMAKE_PREFIX_PATH/include页眉和$CMAKE_PREFIX_PATH/libs的库。

从cmake的文件 :

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



Answer 5:

通过添加多个路径(由分号和没有空格分隔)使用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


Answer 6:

我以前遇到过类似的情况。 我解决它通过之前将在此下面的代码find_library()

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

那么它可以找到库的位置。



文章来源: cmake - find_library - custom library location