1. ホーム
  2. c++

[解決済み] コナンでライブラリが見つからない

2022-03-13 20:24:24

質問

コナンを理解するために、不思議な問題に遭遇したので、皆さんの助けや助言をお願いします。

まず最初に、エラーについて。

よく知られている: /bin/ld: cannot find -lnlohmann_json_schema_validator

私がしようとしていること: nlohmann_json をベースにした json-schema-validator の主要なサンプルを、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 でライブラリが見つからないことは確認しましたが、私はすべて (Conan プロファイルや Cmake など) デフォルトの設定を使用しており、コンパイル時にライブラリを静的に使用したいので、なぜ /bin/ld が /home/<user>/.conan/data/json-schema-validator/2.1.0/_/_/package/feb79143ef49afa1ac08f157e4ea835476439057/lib ... 私の見解では、conan側はかなり正確なようです... Makefileを構築するときに、なぜCMakeに正しいパスを与えないのでしょうか?
  • CMakeLists.txt の変更("Point 1" と "Point 2" の間)、"unrecommanded" の使用かと思い、変更しました。 conan_cmake_run(...) . に従って変更したわけです。 のドキュメントを参照してください。
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 レポを vendor フォルダにクローンして、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のアプローチです。