目前,我试图让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”的内容为“包括”图书馆可以找到,但这种方式是无法正确处理多个版本?
最简单的解决方案可以是加HINTS
到每个find_*
请求。
例如:
find_library(CURL_LIBRARY
NAMES curl curllib libcurl_imp curllib_static
HINTS "${CMAKE_PREFIX_PATH}/curl/lib"
)
为了加速我会强烈建议使用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
你想要的方式。 我看到下面的方法来解决这个问题:
把所有的库文件在同一目录。 也就是说, include/
将包含所有库,头文件lib/
-二进制文件,等仅供参考,这是大多数类UNIX系统中常见的布局。
设置全局环境变量CMAKE_PREFIX_PATH
到D:/develop/cmake/libs/libA;D:/develop/cmake/libs/libB;...
。 当您运行CMake的,它会aautomatically捡起这个的环境变量和填充它自己的CMAKE_PREFIX_PATH
。
编写一个包装.BAT脚本,它会调用cmake
使用命令-D CMAKE_PREFIX_PATH=...
参数。
你有嵌套的一个额外水平。 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()被调用。
通过添加多个路径(由分号和没有空格分隔)使用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
我以前遇到过类似的情况。 我解决它通过之前将在此下面的代码find_library()
set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/)
那么它可以找到库的位置。