我正在构建一个使用Protobuf库的(第三方)项目(但这个问题很普遍)。我的系统在系统范围内安装了比项目兼容的更新版本的Protobuf。所以我从源代码下载并编译了旧版本的Protobuf。
该项目使用CMake,在其CMakeLists.txt中有:
#include <windows.h>
#include <conio.h>
BOOL IsKeyPressed(KEY_CODE key)
{
if (GetAsyncKeyState(key) < 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
int select_menu(char**menus, int x, int y, int items_count)
{
int selection = 0;
show_menu(x, y, menus, items_count);
gotoxy(x, y);
while (1)
{
if (IsKeyPressed(vk_Down))
{
int xx = wherex();
int yy = wherey() + 1;
if ((yy - x + 1) > items_count)
{
gotoxy(x, y);
}
else
{
gotoxy(xx, yy);
}
}
if (IsKeyPressed(vk_Up))
{
int xx = wherex();
int yy = wherey() - 1;
if (yy < y)
{
gotoxy(x, y + items_count);
}
else
{
gotoxy(xx, yy);
}
}
if (IsKeyPressed(vk_Return))
{
int xx = wherex();
int yy = wherey();
selection = yy - y + 1;
}
}
return selection;
}
然而,找到了(不兼容的)系统安装。当然,CMake并不了解我的Protobuf定制版本。但是我怎么说呢?
我在find_package(Protobuf REQUIRED)
中创建了一个FindProtobuf.cmake
文件,并希望构建过程使用此文件来查找Protobuf。但我还没有成功迫使CMake拿起这个而不是系统。我认为原因很明显来自~/usr/share/cmake-3.0/Modules/
的CMake文档:
该命令有两种搜索包的模式:“模块”模式和“配置”模式。使用上述简化签名调用命令时,模块模式可用。 CMake在CMAKE_MODULE_PATH中搜索名为Find&lt; package&gt; .cmake的文件,然后进行CMake安装。如果找到该文件,则由CMake读取并处理。 ...如果没有找到模块并且未给出MODULE选项,则命令进入Config模式。
因此,在我成功更改find_package
之前,CMake只会选择已安装到默认系统路径的CMAKE_MODULE_PATH
,并且无法继续进行“#34;配置”。模式,我可以使用FindProtobuf.cmake
。
对我来说,编辑CMAKE_PREFIX_PATH
非常重要,因为它属于我不会维护的第三方项目。
我尝试过的(一切都没有成功):
CMakeLists.txt
(env。变量不是&#34;转移&#34;到具有相同名称的CMake变量)CMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules cmake ...
(可能无法正常工作?)cmake -DCMAKE_MODULE_PATH=~/usr/share/cmake-3.0/Modules ...
(该项目不支持Protobuf的这种覆盖)在我看来,遗憾的是,改变Protobuf_DIR=path/to/my/protobuf cmake ...
使用的CMAKE_MODULE_PATH
的唯一方法是在find_package
内改变它,这正是我想要避免的。
对于如何不触及CMakeLists.txt
并仍然说服CMakeLists.txt
找到我的自定义Protobuf,您有任何想法/解决方法吗?
作为参考,该项目的CMake部分是on bitbucket。
答案 0 :(得分:2)
作为对您问题的直接回答,是的,您可以通过运行 CMAKE_MODULE_PATH
在命令行设置 cmake -DCMAKE_MODULE_PATH=/some/path -S /path/to/src -B /path/to/build
。
但这可能不会做你想要它做的事情;见下文。
您提供的 Bitbucket 链接已失效,但这里有一些建议可能会有所帮助。
CMAKE_PREFIX_PATH
或 Protobuf_ROOT
(v3.12+) 之一设置为 Protobuf 安装根目录,您可以将 CMake 定向到您的自定义 Protobuf 安装。CMAKE_FIND_PACKAGE_PREFER_CONFIG
设置为 true (v3.15+) 来告诉 find_package
先尝试 CONFIG
模式。然后将 Protobuf_DIR
设置为包含 ProtobufConfig.cmake
的目录。FindProtobuf
模块中记录的变量,这里:https://cmake.org/cmake/help/latest/module/FindProtobuf.html所有这些变量都可以在配置命令行中使用 -D
标志设置。
填充 CMake 变量以启动的环境变量很少,我会避免依赖它们。这里有一个详尽的列表:https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html。 CMAKE_MODULE_PATH
不在其中。