我在做一个我需要用利伯钠的项目。我已经成功地将它包含在我的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;
}这方面的产出如下:
here1另一边
如人们所料
什么起作用:
。
如果我运行并运行beautifully.,那么我的程序将运行
如果我在
#include <sodium.h>,我成功地被带到/usr/local/ cmd+click目录中的sodium.h文件中,并且正在接收intellisense,所以我相对确定库本身已经成功地安装在我的计算机上。不起作用的是:
make,得到以下output:[ 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是正确的,而cmak.src是成功的,没有错误。
如果有人能对这个问题有所了解的话,我将非常感激。如果你回答或试图回答这个问题,谢谢你抽出时间。
发布于 2021-12-28 02:21:20
以下是我错过的解决方案:
TL.DR i使用了错误的变量
在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成功地工作了,并且可执行文件成功地链接到库中。
这是我最后一个工作的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}")https://stackoverflow.com/questions/70501733
复制相似问题