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"时,可以找到该库,但是那样就无法处理多个版本吗?
最简单的解决方案可能是向每个
例如:
1 2 3 4 | find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static HINTS"${CMAKE_PREFIX_PATH}/curl/lib" ) |
对于Boost,我强烈建议您使用FindBoost标准模块并将
我看到有两个人将该问题放入了他们的收藏夹,因此我将尝试回答对我有用的解决方案:
我不是使用查找模块,而是为所有已安装的库编写配置文件。这些文件非常简单,也可以用于设置非标准变量。 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 |
无法以所需的方式自动设置
将所有库文件放在同一目录中。也就是说,
将全局环境变量
编写一个包装器.bat脚本,该脚本将使用
您有一层额外的嵌套。
CMAKE将在
从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.
我遇到过类似的情况。我通过在
1 | set(CMAKE_PREFIX_PATH /the/custom/path/to/your/lib/) |
然后它可以找到图书馆的位置。