首页 > 解决方案 > 无法理解 cmake find_package 行为

问题描述

我正在使用 cmake find_package 来查找安装在两个位置的包,一个在系统路径 (/usr/lib) 上,另一个在我的自定义路径 (/my/custom/path/lib) 上。我想要找到的是自定义路径上的那个,因为我只想执行以下操作:

cmake .. -DCMAKE_PREFIX_PATH=/my/custom/path

但我用这个命令得到的是系统上安装的那个。

但是,如果我将默认 cmake 模块路径上的 FindMyPackage.cmake 脚本复制到另一个文件夹并使用它,那么找到的库就是自定义路径中的库(所需的库),如下所示:

cmake .. -DCMAKE_PREFIX_PATH=/my/custom/path -DCMAKE_MODULE_PATH=/path/to/copy/of/script

有人可以解释一下为什么会这样吗?以及如何在不指定自定义 FindXXX.cmake 脚本的情况下指示 cmake 仅查找自定义项而不是系统项?

请注意,我想在不编辑 CMakeLists.txt 的情况下完成此操作,仅使用 cmake 标志,在 find_package() 函数上添加 NO_* 选项不是理想的解决方案,因为我想根据外部状态使用系统之一或自定义的我不想为此编辑 cmake 脚本。

谢谢努诺


更新

脚本是 FindProtobuf.cmake,在我看来这是一个版本问题......新版本使用 select_library_configurations 而旧版本没有,所以我的自定义路径是调试系统正在发布......我认为在旧版本上使用的第一个是发行版。在我的模块路径上,我得到了将调试与发布区分开来的最新版本,如果我的项目处于调试状态,则选择正确的库......这似乎没有问题:(但这不容易找到或理解不......

标签: c++cmake

解决方案


推荐阅读