#c #cmake #capnproto
#c #cmake #capnproto
Вопрос:
Почему я должен устанавливать
set(CAPNP_LIB_CAPNP-JSON "")
в моем CMakeLists.txt для того, чтобы не получить ошибку? Ошибка следующего вида:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CAPNP_LIB_CAPNP-JSON (ADVANCED)
linked by target "client" in directory <...>
linked by target "server" in directory <...>
Способ, которым я использую поддержку capnproto CMake, заключается в копировании файла cmake, включенного в исходный код capnproto, в мой проект и включении его вручную. (Есть ли лучший / стандартный способ сделать это? Кажется хакерским.) Остальное просто взято из инструкций файла CMake.
Фрагмент CMake:
# so capnp cmake plugin is found
set(CapnProto_DIR "${CMAKE_CURRENT_SOURCE_DIR}/etc/cmake")
# for some reason there is some json lib or something that isn't found?
#set(CAPNP_LIB_CAPNP-JSON "")
find_package(CapnProto REQUIRED)
include_directories(${CAPNP_INCLUDE_DIRS})
add_definitions(${CAPNP_DEFINITIONS})
set(CAPNPC_SRC_PREFIX "src/capnp")
# capnp out of source config
set(CAPNPC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CAPNPC_OUTPUT_DIR})
# gen cpp
capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS
src/capnp/schema.capnp
)
CMake 3.6.2, сборка с использованием встроенных команд сборки CLion. capnp устанавливается через homebrew, последнюю версию.
Почему я получаю сообщение об ошибке с битом JSON? О чем это?
Кроме того, есть ли лучший способ включить официальный файл Cap’n Proto CMake? Казалось, что он не распространяется вместе с заголовочными и библиотечными файлами при установке через homebrew.
Комментарии:
1.
The way I'm using capnproto CMake support is by copying the cmake file included in the capnproto source into my project and including it manually.
— Естественный способ — настроить путь поиска, чтобы найти файл на месте. Например, установив .CapnProto_DIR
Why am I getting the error about the JSON bit? What is that about?
— Это зависит от содержимого.cmake
вашего скрипта. Кстати, сообщение об ошибке дает вам подсказку, где выполняется связывание, почему бы не проверить эти каталоги?2. Добавлена ссылка на сценарий cmake, на который я ссылаюсь: github.com/sandstorm-io/capnproto/blob/master/c++/cmake /… Повторная ссылка: сообщение, похоже, просто сообщает мне, в основном, какие цели используют сгенерированные файлы capnp, что совсем не кажется полезным. Я вообще не понимаю, что
CAPNP_LIB_CAPNP-JSON
это такое — на данный момент мне не очень удобно копаться в файлах сценариев CMake!3. Итак, это скрипт, который использует эту переменную, см. Строку
find_library(CAPNP_LIB_CAPNP-JSON capnp-json
. Я не знаю, зачем ему нужна эта библиотека, можно погуглить другиеFindCapnp.cmake
скрипты, которые не используют json. Вы спрашиваете в началеWhy do I have to set ...
— вам нужно определить пустую переменную для преодоления использования json.4. Хорошо, я понимаю эту механику. Вопрос в том, что, поскольку я использую «официальный» CMake-файл Cap’n Protos, это должно работать без применения такого обходного пути, верно? Потому что, если я не определяю эту переменную, я получаю предупреждение, что наводит меня на мысль, что я использую что-то неправильно. Что заставляет меня спросить — что я здесь делаю не так? Я понимаю, что для ответа на этот вопрос требуется углубиться в файл CMake дальше или иметь более глубокие знания о том, как Cap’n Proto работает здесь, что он делает, что ему здесь нужно.
5. И хорошо, по сути, это означает, что скрипт не может найти библиотеку «capnp-json», т. Е. В моей системе отсутствует файл .dylib (я на OS X)? В противном случае переменная была бы определена скриптом, и мне не пришлось бы устанавливать ее самостоятельно?
Ответ №1:
Оказывается, поддержка кодирования / декодирования json является еще (октябрь 2016 г.) неизданной функцией Cap’n Proto, и попытка использовать файл .cmake из главной ветки с последней выпущенной версией приводит к этому конфликту.
Возможные решения:
1) Используйте обходной путь, опубликованный в вопросе, т. е.
set(CAPNP_LIB_CAPNP-JSON "") # add this before next line
find_package(CapnProto REQUIRED)
2) Используйте выпущенную версию скрипта .cmake здесь: FindCapnProto.cmake
3) Создайте и установите Cap’n Proto из исходного кода, используйте с последним скриптом .cmake.