cmake – find_library – 自定义库位置

我目前正试图让我的项目(Windows)上运行CMake。 我想要使​​用安装了所有库的自定义位置。 为了告诉CMake这条路,我试图这样做:

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

但是当我试图find图书馆

 find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static) 

CMake找不到它。 当我设置我的前缀path

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

图书馆所在地

所以我的问题是:我如何正确configurationCMake的目录结构在一个自定义的位置,看起来像这样:

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

在“包含”谎言公共标题和“lib”是编译的库。

希望有人能帮助我 – 在此先感谢

编辑:目前我的解决方法是,在我search库之前做到这一点:

 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() 

但是这种方式默认模块升压不会find它,直到它因为boost的目录结构是有点不同。

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

当我移动的内容,如果“boost-1_50”“包含”库可以find,但这样就不可能处理多个版本的权利?

Solutions Collecting From Web of "cmake – find_library – 自定义库位置"

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

例如:

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

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

我看到两个人把这个问题放在他们的收藏夹,所以我会尝试回答解决方案对我来说:而不是使用查找模块,我正在编写所有库安装的配置文件。 这些文件非常简单,也可以用来设置非标准变量。 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 ) 

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

希望这对其他人有帮助。

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

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

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

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

你有一个额外的嵌套级别。 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()被调用。

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

请注意,cmake将在以下任何文件夹中查找配置文件,其中是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 

我遇到过类似的情况。 我通过在find_library()之前添加下面的代码来解决它:

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

那么它可以找到图书馆的位置。