【问题标题】:The following variables are used in this project, but they are set to NOTFOUND此项目中使用了以下变量,但它们设置为 NOTFOUND
【发布时间】:2020-07-22 10:09:24
【问题描述】:

我是第一次使用 CMake,但有一些理解上的问题。谁能向我解释一下 ERROR 是什么意思,为什么以及如何解决它?

对于我的项目,我下载了 git-libraries "libubox-master" 和 "ubus-head" 并将它们分别放入我的项目目录中的文件夹 "libubox" 和 "ubus" 中。这些库已经有不同的 CMakeList.txt 文件。 在我的项目目录中,我自己创建了文件 client.c、server.c、server.h 和 CMakeLists.txt。

我的文件夹结构:

project/
--------cmake-build-debug/ ...
--------libubox/ ... provided files and folders, including CMakeFiles
--------ubus/ ... provided files and folders, including CMakeFiles
--------client.c
--------CMakeLists.txt
--------server.c
--------server.h

我的 CMakeList.txt 文件如下所示:

   cmake_minimum_required(VERSION 3.7)
   project (ubusDemo)

   add_subdirectory(libubox)
   add_subdirectory(ubus)

   add_executable(Client client.c)
   add_executable(Server server.c)

所以这只是一个简单的文件 - 我是不是忘记了一些必要的东西?

我得到的错误信息:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
blob_library
    linked by target "ubusd" in directory /home/matthias/Workspace/ubusDemo/ubus
    linked by target "cli" in directory /home/matthias/Workspace/ubusDemo/ubus
    linked by target "server" in directory /home/matthias/Workspace/ubusDemo/ubus/examples
ubox_include_dir
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/lua
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
   used as include directory in directory /home/matthias/Workspace/ubusDemo/ubus/examples
ubox_library
    linked by target "ubus" in directory /home/matthias/Workspace/ubusDemo/ubus
    linked by target "ubusd" in directory /home/matthias/Workspace/ubusDemo/ubus
    linked by target "cli" in directory /home/matthias/Workspace/ubusDemo/ubus
    linked by target "server" in directory /home/matthias/Workspace/ubusDemo/ubus/examples
    linked by target "client" in directory /home/matthias/Workspace/ubusDemo/ubus/examples

我必须在哪里进行更改? 就在我的 CMakeLists.txt 文件中,还是我必须在其他 CMakeLists.txt 文件中添加一些依赖项?

我如何使用一些头文件,例如libubox 像我的client.c 文件中的blob.h 吗? 写#include <libubox/blob.h>对吗?

不幸的是,我以前没有使用过 Makefiles(既不是 CMake 也不是 Make)。 我希望,有人可以帮助我。

【问题讨论】:

  • 你必须设置变量blob_libraryubox_include_dir和ubox_library。然后你应该将库链接到你的目标。
  • @Thomas Sablik:我必须在哪里设置这些变量?
  • 你如何配置你的项目?您可以运行 CMake 并使用-D 设置变量或使用ccmake 或cmake-gui。您可以编辑文件CMakeCache.txt。您还可以使用set 在您的 CMake 文件中静态设置它们。

标签: c linux cmake dependency-management


【解决方案1】:

在每个外部存储库中搜索这些未设置的变量后,我在ubus CMake 文件中找到了它们here:

IF(BUILD_STATIC)
  FIND_LIBRARY(ubox_library NAMES ubox.a)
  FIND_LIBRARY(blob_library NAMES blobmsg_json.a)
ELSE(BUILD_STATIC)
  FIND_LIBRARY(ubox_library NAMES ubox)
  FIND_LIBRARY(blob_library NAMES blobmsg_json)
ENDIF(BUILD_STATIC)

FIND_PATH(ubox_include_dir libubox/usock.h)
INCLUDE_DIRECTORIES(${ubox_include_dir})

ubus 中的这段代码正在寻找由libubox 包提供的头文件和构建 库文件。它假定libubox 已安装在您的机器上,并且搜索到的组件可以在标准系统路径中找到。

使用add_subdirectory() 将libubox 包含在您的CMake 项目中将无法构建它很快;相反,当您调用add_subdirectory(ubus) 时,需要构建和安装libubox。

因此,在运行 CMake 项目之前,您必须手动单独构建和安装 libubox 包。或者,您可以尝试让 CMake 在您的项目中处理这些步骤,如 ExternalProject_Add() 和 execute_process 或 FetchContent,如 this question 的一些答案中所述。如果您选择后者,我鼓励您逐一研究以确定哪种解决方案最适合您的项目。

另外,如果刚刚开始使用 CMake,CMake tag 有一些有用的 CMake 教程和资源。

【讨论】:

  • 所以,就我而言,ExternalProject_Add() 似乎是最好的解决方案。
  • @squaresskittles,看来,在我的 build_dir/ 和 cmake-bild-debug/ 目录中为 libubox 创建目标结构工作正常。在 lib/ 中创建了一些 .a 和 .so 文件。在 include/libubox/ 中,我也发现了一些 .h 文件,如预期的那样。但是现在又出现了一个错误:in server.c and in client.c: fatal error: ubus/libubus.h: file or directory could not be found。 #include 不正确吗? 的头文件可以在构建过程中找到。对不起,我的英语,我希望你明白我的意思。
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2022-12-15
  • 2021-02-07
相关资源
最近更新 更多