В чем причина этой проблемы с недопустимым путем при попытке запустить компилятор буфера протокола cpp из CMake в Windows 10 и как я могу ее решить?

#cmake #windows-10 #protocol-buffers #android-auto #protobuf-c

Вопрос:

Я пытаюсь создать проект aasdk на компьютере с Windows 10. Для этого я пытаюсь выполнить следующие команды в корневом каталоге репозитория git:

 mkdir buildDir
cd buildDir
cmake ..
cmake --build . --config Release
 

Очевидно, что последняя команда-это та, которая терпит неудачу. При выполнении этой команды я получаю следующий вывод:

 -- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19041.
-- Found libusb-1.0:
--  - Includes: C:/libusb-master/x64/Release
--  - Libraries: C:/libusb-master/x64/Release/lib/libusb-1.0.lib
-- Configuring done
-- Generating done
-- Build files have been written to: C:/aasdk-development/buildDir
Microsoft (R) Build Engine version 16.8.3 39993bd9d for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

C:Program Files (x86)Microsoft Visual Studio2019CommunityMSBuildMicrosoftVCv160Microsoft.CppCommon.targets(200
,5): warning MSB8062: Custom build for item "C:aasdk-developmentbuildDirCMakeFilesb2b8e2a3c1aae1e014a7c3c3f8aadde7AVCha
nnelData.pb.h.rule" specifies invalid path "C:aasdk-developmentbuildDiraasdk_protoprotobuf::protoc" as an additional dep
endency. This may cause incremental build to work incorrectly. [C:aasdk-developmentbuildDiraasdk_protoaasdk_proto.vcxpro
j]
...
  Running cpp protocol buffer compiler on C:/aasdk-development/aasdk_proto/AVChannelData.proto
  The filename, directory name, or volume label syntax is incorrect.
C:Program Files (x86)Microsoft Visual Studio2019CommunityMSBuildMicrosoftVCv160Microsoft.CppCommon.targets(238
,5): error MSB8066: Custom build for 'C:aasdk-developmentbuildDirCMakeFilesb2b8e2a3c1aae1e014a7c3c3f8aadde7AVChannelDat
a.pb.h.rule;...' exited
with code 123. [C:aasdk-developmentbuildDiraasdk_protoaasdk_proto.vcxproj]

 

Где ... одно и то же сообщение повторяется для каждого файла *.proto внутри aasdk_proto каталога. Из того, что я могу сказать, кажется, что он считает некоторые пути недействительными. Чего я не могу сказать, так это какие пути и каким образом они недействительны.

После первого комментария я решил проверить, откуда он берет эти пути. Ниже приведено содержимое CMakeLists.txt для protobuf, найденное в aasdk_proto каталоге:

 include(FindProtobuf)
find_package(Protobuf REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIR})

file(GLOB_RECURSE proto_files ${CMAKE_CURRENT_SOURCE_DIR}/*.proto)
protobuf_generate_cpp(proto_sources proto_headers ${proto_files})
add_library(aasdk_proto SHARED ${proto_headers} ${proto_sources})
target_link_libraries(aasdk_proto ${PROTOBUF_LIBRARIES})
 

Интерес представляет 5-я строка , в которой перечислены все файлы *.proto в соответствующем каталоге перед вызовом protobuf_generate_cpp , та часть, которая, как я полагаю, вызывает ошибки.

Добавление message(STATUS ProtoFiles: ${proto_files}) после строки 5 для печати путей дало правильные значения, по крайней мере, на мой взгляд:

 C:/aasdk-development/aasdk_proto/AbsoluteInputEventData.proto;C:/aasdk-development/aasdk_proto/AbsoluteInputEventData.proto;...
 

Я заменил косую черту на обратную косую черту просто для смеха, так как это нравится Windows, но это не сработало.

Комментарии:

1. "C:aasdk-developmentbuildDiraasdk_protoprotobuf::protoc" Это не похоже на правильный путь!

2. Я согласен, но опять же, насколько я знаю, это может быть нормальным выходом CMake/protobuf. Несмотря на это, я не думаю, что знаю, что проверять. Смотрите мою правку.

3. Удалять include(FindProtobuf) . Подобные сценарии FindXXX.cmake должны включаться только через find_package , что вы уже делаете.