关于c ++:cmake-find_library-自定义库位置

cmake - find_library - custom library location

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

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

但是当我尝试用

1
find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static)

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

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

...图书馆位于。

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

1
2
3
4
5
6
7
8
9
10
D:/develop/cmake/libs/
-> libA
   -> include
   -> lib
-> libB
   -> include
   -> lib
-> ...
   -> include
   -> lib

在" include"中是公共头,在" lib"中是已编译的库。

希望有人能帮助我-预先感谢

编辑:
对于我来说,当前的解决方法是在搜索库之前执行此操作:

1
2
3
4
5
6
7
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的目录结构有些不同。

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

当我将内容从" boost-1_50"移动到" include"时,可以找到该库,但是那样就无法处理多个版本吗?


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

例如:

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

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


我看到有两个人将该问题放入了他们的收藏夹,因此我将尝试回答对我有用的解决方案:
我不是使用查找模块,而是为所有已安装的库编写配置文件。这些文件非常简单,也可以用于设置非标准变量。 CMake将(至少在Windows上)在以下位置搜索那些配置文件

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

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

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

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

1
2
3
4
5
6
7
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。您可以将其设置为环境变量,以避免在cmake配置文件中包含绝对路径

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

1
2
3
4
5
6
7
[cc lang="cpp"]/                                               (W)
[cc lang="cpp"]/(cmake|CMake)/                                 (W)
[cc lang="cpp"]/<name>*/                                       (W)
[cc lang="cpp"]/<name>*/(cmake|CMake)/                         (W)
[cc lang="cpp"]/(lib/|lib|share)/cmake/<name>*/          (U)
[cc lang="cpp"]/(lib/|lib|share)/<name>*/                (U)
[cc lang="cpp"]/(lib/|lib|share)/<name>*/(cmake|CMake)/  (U)

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

1
D:/develop/cmake/libs/libA;D:/develop/cmake/libB

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

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

  • 将全局环境变量CMAKE_PREFIX_PATH设置为D:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;...。当您运行CMake时,它将自动获取此环境变量并填充其自己的CMAKE_PREFIX_PATH

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


  • 您有一层额外的嵌套。
    CMAKE将在$CMAKE_PREFIX_PATH/include下搜索标题,并在$CMAKE_PREFIX_PATH/libs下搜索库。

    从CMAKE文档中:

    For each path in the CMAKE_PREFIX_PATH list, CMake will check
    "PATH/include" and"PATH" when FIND_PATH() is called,"PATH/bin" and
    "PATH" when FIND_PROGRAM() is called, and"PATH/lib and"PATH" when
    FIND_LIBRARY() is called.


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

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

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