c++ - 使用柯南找不到图书馆
问题描述
我正在请求您的所有帮助和/或就我在试图理解柯南时遇到的一个奇怪问题提供建议。
首先,错误:
一个众所周知的 :/bin/ld: cannot find -lnlohmann_json_schema_validator
我正在尝试做的事情:尝试使用 cmake 和 conan 包管理器构建基于 nlohmann_json 的 json-schema-validator 的主要示例。
链接:
CMakeLists.txt 非常简单:
cmake_minimum_required(VERSION 3.10)
project(app VERSION 1.0.0 LANGUAGES CXX)
add_executable(${PROJECT_NAME} src/main.cpp)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/master/conan.cmake"
"${CMAKE_BINARY_DIR}/conan.cmake")
endif()
include(${CMAKE_BINARY_DIR}/conan.cmake)
# Point 1
conan_cmake_run(REQUIRES json-schema-validator/2.1.0 BASIC_SETUP BUILD missing)
target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})
# Point 2
target_include_directories(${PROJECT_NAME} PUBLIC "src")
从这一点开始,我搜索并发现了不同的信息:
- https://stackoverflow.com/a/34256630/7135482:确定 /bin/ld 在链接时找不到库,但是因为我对所有内容(柯南配置文件、Cmake 等)都使用默认配置并且想要该库作为编译过程中的静态,我想知道为什么 /bin/ld 找不到位于
/home/<user>/.conan/data/json-schema-validator/2.1.0/_/_/package/feb79143ef49afa1ac08f157e4ea835476439057/lib
...的库...从我的角度来看,在柯南方面似乎非常准确...为什么在构建 Makefile 时它不能为 CMake 提供正确的路径? - 我更改了 CMakeLists.txt(在“Point 1”和“Point 2”之间),认为这是使用了“unrecommanded”
conan_cmake_run(...)
。所以我根据Github上的文档改了
conan_cmake_configure(REQUIRES json-schema-validator/2.1.0
GENERATORS cmake)
conan_cmake_autodetect(settings)
conan_cmake_install(PATH_OR_REFERENCE .
BUILD missing
REMOTE conan-center
SETTINGS ${settings})
(在这里我得到了错误fatal error: nlohmann/json-schema.hpp: No such file or directory
。所以,似乎这种做事方式甚至没有#include文件)
- 我让库及其示例工作的唯一方法是完全绕过柯南......,将 nlohmann_json 存储库和 json-schema-validation 存储库克隆到供应商文件夹中,并将它们添加到 CMake 系统,如下所示:
#add_subdirectory(vendor/json)
#add_subdirectory(vendor/json-schema-validator)
#target_link_libraries(${PROJECT_NAME} nlohmann_json::nlohmann_json nlohmann_json_schema_validator)
但是,如果让我的项目构建的唯一方法是避免使用包管理器,那么尝试使用包管理器让我的生活更轻松有什么意义呢?
有人已经遇到过这类问题吗?或者有另一个想法我可以尝试或改变?
任何帮助将不胜感激!所以,提前谢谢!
解决方案
我不知道您在哪里找到了教程、示例或说明,但您应该阅读官方的 cmake-conan README,其中包含一个功能示例。
就是说,您的情况可以通过以下示例解决:
cmake_minimum_required(VERSION 3.5)
project(validator CXX)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.16.1/conan.cmake"
"${CMAKE_BINARY_DIR}/conan.cmake"
EXPECTED_HASH SHA256=396e16d0f5eabdc6a14afddbcfff62a54a7ee75c6da23f32f7a31bc85db23484
TLS_VERIFY ON)
endif()
include(${CMAKE_BINARY_DIR}/conan.cmake)
conan_cmake_configure(REQUIRES json-schema-validator/2.1.0
GENERATORS cmake_find_package)
conan_cmake_autodetect(settings)
conan_cmake_install(PATH_OR_REFERENCE .
BUILD missing
REMOTE conan-center
SETTINGS ${settings})
find_package(nlohmann_json_schema_validator REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} nlohmann_json_schema_validator::nlohmann_json_schema_validator)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
这里有一些区别,我使用的是 CMake 目标而不是 CMake 变量CONAN_LIBS
,并且我要求cmake_find_package
生成器。这是一种现代 CMake 方法。
推荐阅读
- pentaho - 创建数据库源 - 定义连接 - 多列连接
- vhdl - 即使没有显示错误,VHDL 仿真也会挂起
- python - 如何从 QPlainTextEdit 正确获取 Unicode 文本输入?
- javascript - API 返回 JSON 与 Javascript
- roku - Roku 广告框架:无法创建 mediaPlayer
- c++ - 链接问题 Boost.Python
- android-studio - 如何在android中使用解析服务器查询来更新应用程序
- javascript - 将 HTML 输入文件作为 Firebase Cloud Function 的参数传递
- python - 为什么我在 python 中收到“连接被拒绝”?无法使用现有解决方案解决
- sql - 日期时间的一个奇怪案例