cmake -查找库-自定义库位置

4uqofj5v  于 2022-12-23  发布在  其他
关注(0)|答案(6)|浏览(178)

我正在为我的项目运行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"到"include",可以找到库,但这样就不可能处理多个版本,对吗?

8nuwlpux

8nuwlpux1#

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

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

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

gwbalxhn

gwbalxhn2#

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

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

(可通过环境变量设置)。例如,boost配置位于路径中

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 )

非常直接+当你写一些帮助函数的时候,可以进一步缩小配置文件的大小。我在这个设置中遇到的唯一问题是我还没有找到一种方法来给予配置文件一个比查找模块更高的优先级-所以你需要删除查找模块。
希望这对其他人有帮助。

zlhcx6iw

zlhcx6iw3#

通过添加多个路径(用分号和白色分隔)来使用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
nwsw7zdq

nwsw7zdq4#

没有办法按照你想要的方式自动设置CMAKE_PREFIX_PATH,我看到以下方法可以解决这个问题:
1.将所有库文件放在同一目录中。也就是说,include/将包含所有库文件、lib/二进制文件等的头文件。仅供参考,这是大多数类UNIX系统的常见布局。
1.将全局环境变量CMAKE_PREFIX_PATH设置为D:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;...。当你运行CMake时,它会自动获取这个环境变量并填充它自己的CMAKE_PREFIX_PATH
1.编写一个wrapper .bat脚本,该脚本将使用-D CMAKE_PREFIX_PATH=...参数调用cmake命令。

lb3vh1jj

lb3vh1jj5#

您有一个额外的嵌套级别。CMAKE将在$CMAKE_PREFIX_PATH/include下搜索头文件,在$CMAKE_PREFIX_PATH/libs下搜索库文件。
来自CMAKE documentation
对于CMAKE_PREFIX_PATH列表中的每个路径,CMake将在调用FIND_PATH()时检查“PATH/include”和“PATH”,在调用FIND_PROGRAM()时检查“PATH/bin”和“PATH”,在调用FIND_LIBRARY()时检查“PATH/lib”和“PATH”。

jobtbby3

jobtbby36#

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

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

那么它可以找到库位置。

相关问题