cmake build protobuf ошибка: nmake: фатальная ошибка U1073: не знаю, как сделать "PROTOBUF_PROTOC_EXECUTABLE-NOTFOUND"

это мое дерево проектов:

proto-build
     |—— build/           #empty, used for cmake building
     |—— include/
           |—— google/      #protobuf headers
     |—— lib/
           |—— libprotobuf-lite.lib
     |—— proto/
           |—— test.proto
     |—— CMakeLists.txt

это CMakeLists.формат txt:

cmake_minimum_required(VERSION 3.5)

set(CMAKE_VERBOSE_MAKEFILE ON)

SET(ROOT_PATH ".")
SET(PROTO_DIR ${ROOT_PATH}/proto)
SET(PROTOBUF_LIBRARY ${ROOT_PATH}/lib)
SET(PROTOBUF_INCLUDE_DIR ${ROOT_PATH}/include)


find_package(Protobuf REQUIRED)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_DIR}/test.proto)
add_library(foo ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(foo ${PROTOBUF_LIBRARIES})

затем я открываю cmd и нахожу proto-build/build/, run command:

cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..

работает отлично. затем выполните команду:

nmake

ошибки:

NMAKE : fatal error U1073: don't know how to make 'E:Sourceproto-buildPROTOBUF_PROTOC_EXECUTABLE-NOTFOUND'
Stop.
NMAKE : fatal error U1077: '"D:Program_Filesx86Microsoft Visual Studio 14.0VCBINamd64nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"D:Program_Filesx86Microsoft Visual Studio 14.0VCBINamd64nmake.exe"' : return code '0x2'
Stop.

2 ответа

  1. Executalbe Protobuf не найден. Таким образом, неправильный путь E:\Source\proto-build\PROTOBUF_PROTOC_EXECUTABLE-NOTFOUNDзаписывается в Makefile и это ошибки.

  2. thx для предложения usr1234567, у меня есть выяснить, это новые CMakeLists.формат txt:

    cmake_minimum_required(VERSION 3.5)
    
    set(CMAKE_VERBOSE_MAKEFILE ON)
    
    SET(ROOT_PATH ".")
    SET(PROTO_DIR ${ROOT_PATH}/proto)
    
    
    #must define these tow variables:PROTOBUF_INCLUDE_DIR & PROTOBUF_LIBRARY, even the value is invalid. 
    SET(PROTOBUF_INCLUDE_DIR .) 
    SET(PROTOBUF_LIBRARY .) 
    
    SET(PROTOBUF_PROTOC_EXECUTABLE ../protoc.exe)
    
    #in this directory, contains protobuf includes: top directory is <google>
    SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include)
    
    #if set PROTOBUF_INCLUDE_DIR to the directory of protobuf includes instead of using include_directories, errors occurred when nmake,I don't know why
    include_directories(${THIRD_INCLUDE_DIR})
    
    file(GLOB PROTO_LIST ${PROTO_DIR}/*.proto)
    
    find_package(Protobuf REQUIRED)
    protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_LIST})
    add_library(foo ${PROTO_SRCS} ${PROTO_HDRS})
    target_link_libraries(foo)
    

    используйте этот CMakeLists.txt для camke и nmake, строительство будет успешным.
    есть несколько деталей, на которые нужно обратить внимание, у меня есть комментарий в CMakeLists.формат txt.

    есть странная проблема: необходимо разместить два протокола.exe-файлы в каталоге: один находится в proto-build/, и один из proto-build/, в противном случае произошла бы ошибка: не найден протокол.исполняемый.