【问题标题】:Unable to "make" project even when cmake builds it successfully [duplicate]即使cmake成功构建它也无法“制作”项目[重复]
【发布时间】:2021-12-28 00:38:59
【问题描述】:

我正在做一个需要使用 libsodium 的项目。我已经成功地将它包含在我的 CMakeLists.txt 文件中,如下所示:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)

project(skip-list)

set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "/usr/local/include/sodium" "/usr/local/lib/**")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")

find_package(Sodium REQUIRED)

add_executable(skip-list main.c)
target_include_directories(skip-list PRIVATE ${Sodium_INCLUDE_DIRS})
target_link_libraries(skip-list PRIVATE ${Sodium_LIBS})

我的目录树结构如下:

-.vscode
  -settings.json
-build
  -everything cmake autogenerates
-src
  -cmake
    -all my cmake module files, i.e. FindSodium.cmake
  -main.c
  -CMakeLists.txt

我的 main.c 非常简单,因为我只是想让库包含工作,但我在下面列出了它:

#include <sodium.h>
#include <stdio.h>

int main() {
  printf("here");
  if (sodium_init() < 0) {
    printf("error");
  } else {
    printf("%d\n", sodium_init());
  }
  printf("other side");
  return 0;
}

这个输出是:

这里1 另一边

正如人们所期望的那样

什么有效:

  • 当我从构建目录运行 cmake ../src 时,构建成功并生成一个 Makefile。*

  • 如果我运行clang -lsodium src/main.c -o main 并运行它,我的程序运行良好。

  • 如果我 cmd+点击#include &lt;sodium.h&gt; 我成功地被带到我的 /usr/local/include 目录中的 sodium.h 文件并且我正在接收智能感知,所以我相对确定库本身已成功安装我的机器。

什么不起作用:

    • 当我在构建目录中运行 make 时,我得到以下输出:
[ 50%] Building C object CMakeFiles/skip-list.dir/main.c.o
/Users/anishsinha/Sandbox/skip-list/src/main.c:1:10: fatal error: 'sodium.h' file not found
#include <sodium.h>
         ^~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/skip-list.dir/main.c.o] Error 1
make[1]: *** [CMakeFiles/skip-list.dir/all] Error 2
make: *** [all] Error 2

基本上我得到的是文件 找不到,但我不明白 为什么,或者如何修复它,因为据我所知,当我从命令行编译时,sodium.h 被正确包含,并且 cmake ../src 成功且没有错误。

如果有人能对这个问题有所了解,我将不胜感激。如果您回答或尝试回答此问题,感谢您抽出宝贵时间。

【问题讨论】:

  • 不应该是#include &lt;sodium/sodium.h&gt;
  • sodium.h 的完整路径是什么?
  • @JohnBollinger /usr/local/include/sodium.h
  • @JohnBollinger 我也试过 /usr/local/include/libsodium/include/sodium.h 也存在
  • @273K 不,/usr/local/include 中不存在

标签: c++ c cmake


【解决方案1】:

这是我缺少的解决方案:

TL.DR 我使用了错误的变量

在 Findsodium.cmake 文件中,运行后定义了以下四个变量:

#   sodium_FOUND
#   sodium_INCLUDE_DIR
#   sodium_LIBRARY_DEBUG
#   sodium_LIBRARY_RELEASE

我使用的是 sodium_INCLUDE_DIRS 和 sodium_LIBS,这是我之前使用的 OpenCV 库的约定。在我切换到使用 sodium_INCLUDE_DIR 和 sodium_LIBRARY_RELEASE 后,make 成功运行,并且可执行文件成功与 lib 链接。

这是我的最终 CMakeLists.txt 有效:

cmake_minimum_required(VERSION 3.0.0)

project(skip-list)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")

find_package(Sodium REQUIRED)

add_executable(skip-list main.c)
target_include_directories(skip-list PUBLIC ${sodium_INCLUDE_DIR})
target_link_libraries(skip-list PUBLIC ${sodium_LIBRARY_RELEASE})

message("DIRS: ${sodium_INCLUDE_DIR}")
message("LIBS: ${sodium_LIBRARY_RELEASE}")

【讨论】:

  • 很高兴看到您已修复它。我只是想发布一个答案:CMake 变量区分大小写。见documentation等等……
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多