我是 cmake 的新手,目前正在学习find_package()
在模块模式下,CMake 搜索名为 Find.cmake 的文件。首先在 CMAKE_MODULE_PATH 中搜索该文件,然后在 CMake 安装提供的“查找模块”中搜索。如果找到该文件,则由 CMake 读取并处理该文件。它负责查找包、检查版本并生成任何所需的消息。一些查找模块对版本控制提供有限的支持或不提供支持;检查模块文档。
例如,如果我find_package(OpenCV)使用以下命令键入并运行 cmake_find_debug_mode:
cmake -DCMAKE_FIND_DEBUG_MODE=ON .
Run Code Online (Sandbox Code Playgroud)
而且,屏幕上打印的信息确实显示它首先尝试搜索{Path where I install cmake}/Modules/FindOpenCV.cmake我认为但不确定CMAKE_MODULE_PATH但没有找到的内容,然后它继续搜索并最终从我在一个脚本中定义的OpenCVConfig.cmake环境变量中找到。 OpenCV_DIR
在我打印出消息之前,一切都会如我所料
message(STATUS "CMAKE_PREFIX_PATH : ${CMAKE_PREFIX_PATH}")
message(STATUS "CMAKE_MODULE_PATH : ${CMAKE_MODULE_PATH}")
Run Code Online (Sandbox Code Playgroud)
其中doc中的第一个定义为“FIND_XXX() 用于搜索的路径,并添加了适当的后缀”。
他们俩都没有返回任何内容......
我有两个问题:
(1)为什么find_package偶数${CMAKE_MODULE_PATH}是空的?(2) 如何查看cmake定义的所有这些环境变量,例如CMAKE_MODULE_PATH?
谢谢!!
这困扰了我很长时间:如何进行从任何东西char *到将二进制文件转储到磁盘的指针转换。
在C语言中,您甚至无需考虑。
double d = 3.14;
char *cp = (char *)&d;
// do what u would do to dump to disk
Run Code Online (Sandbox Code Playgroud)
但是,在C ++中,每个人都说C-cast不被接受,我一直在这样做:
double d = 3.14;
auto cp = reinterpret_cast<char *>(&d);
Run Code Online (Sandbox Code Playgroud)
现在这是从cppreference复制的,所以我认为这是正确的方法。
但是,我从多个消息来源读到这是UB。(例如,这个)所以我不禁要问是否有任何“ DB”方式(根据那篇文章,没有)。
我经常遇到的另一种情况是实现这样的API:
void serialize(void *buffer);
Run Code Online (Sandbox Code Playgroud)
您将在其中将很多东西转储到此缓冲区。现在,我一直在这样做:
void serialize(void *buffer) {
int intToDump;
float floatToDump;
int *ip = reinterpret_cast<int *>(buffer);
ip[0] = intToDump;
float *fp = reinterpret_cast<float *>(&ip[1]);
fp[0] = floatToDump;
}
Run Code Online (Sandbox Code Playgroud)
好吧,我想这也是UB。
现在,真的没有“ DB”方法可以完成这两项任务吗?我见过有人uintptr_t用来完成类似于sth的serialize任务,将指针与一起作为整数数学sizeof …