【问题标题】:Cannot find library using Conan使用柯南找不到图书馆
【发布时间】:2021-07-13 19:53:50
【问题描述】:

我正在寻求您的所有帮助和/或就我在试图理解柯南时遇到的一个奇怪问题提供建议。

首先,错误:

知名人士:/bin/ld: cannot find -lnlohmann_json_schema_validator

我正在尝试做的事情: 尝试构建 json-schema-validator 的主要示例,基于 nlohmann_json,使用 cmake 和 conan 包管理器。

链接:

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”之间),认为这是使用“不推荐”conan_cmake_run(...)。于是我按照documentation on 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)

但是,如果让我的项目构建的唯一方法是避免使用包管理器,那么尝试使用包管理器让我的生活更轻松又有什么意义呢?

是否有人已经遇到过此类问题?或者有其他想法我可以尝试或改变?

任何帮助将不胜感激!所以,提前谢谢!

【问题讨论】:

    标签: c++ cmake build conan nlohmann-json


    【解决方案1】:

    我不知道你在哪里找到的教程、示例或解释,但你应该阅读官方的 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 方法。

    【讨论】:

    • 感谢您的回答!我所指的示例是 one :) 但是按照您的 CMakeLists.txt,我注意到我的缺少 list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}),因此无法找到生成的 Find*.cmake。我用 GENERATORS cmake 重试,但仍然给我一个“缺少标题”错误。我不会担心这个,使用cmake_find_package 似乎可以很好地处理缺少的APPEND 行,所以,现在,我会坚持这个:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2014-11-12
    • 2013-12-16
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多