cmake 错误 当文件由EXEC_PROGRAM生成时找不到源文件

cmake error Cannot find source file when file is generated by EXEC_PROGRAM

本文关键字:找不到 源文件 PROGRAM 错误 文件 EXEC cmake      更新时间:2023-10-16

我想在我的项目中使用 protobuf 而不安装,所以我从其他人那里复制库和标头,并创建一个 FindProtobuf.cmake,其中包含名为 protobuf_generate_cpp 的函数,它按我预期生成源代码文件,但add_library找不到文件,这是错误:

Cannot find source file:
    build/basic_types.pb.h 
  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
  .hpp .hxx .in .txx

我在 Ubuntu 18.04.1 中使用 cmake 3.13.4

这些文件完全在构建目录中生成,并且可以通过以下方式显示

message(STATUS "header file: " ${PROTO_HDRS})

这是protobuf_generate_cpp的功能:

function(protobuf_generate_cpp PROTO_SRCS PROTO_HDRS)
  set(SRCS_)
  set(HDRS_)
  math(EXPR idx_max "${ARGC}-1")
  foreach(idx RANGE 2 ${idx_max})
    set(FILE_PATH ${ARGV${idx}})
    if(NOT EXISTS ${FILE_PATH})
      set(FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${FILE_PATH}")
      if(NOT EXISTS ${FILE_PATH})
        message(FATAL_ERROR "File ${FILE_PATH} is not exists!")
      endif()
    endif()
    get_filename_component(FILE_NAME ${FILE_PATH} NAME_WE)
    get_filename_component(ABSOLUTE_FILE_NAME ${FILE_PATH} ABSOLUTE)
    get_filename_component(FILE_PATH ${FILE_PATH} PATH)
    EXEC_PROGRAM("protoc --proto_path ${FILE_PATH} --cpp_out ${CMAKE_BINARY_DIR} ${ABSOLUTE_FILE_NAME}")
    list(APPEND SRCS_ "${CMAKE_BINARY_DIR}/${FILE_NAME}.pb.cc ")
    list(APPEND HDRS_ "${CMAKE_BINARY_DIR}/${FILE_NAME}.pb.h ")
  endforeach()
  set(PROTO_SRCS ${SRCS_} PARENT_SCOPE)
  set(PROTO_HDRS ${HDRS_} PARENT_SCOPE)
endfunction(protobuf_generate_cpp)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS
  basic_types.proto
  calibration_parameters.proto
)
add_library(proto STATIC
  ${PROTO_HDRS}
  ${PROTO_SRCS}
)
add_library(proto STATIC
  ${PROTO_HDRS}
  ${PROTO_SRCS}
)

只能包含源文件。

您可以在下面尝试此代码,

add_library(proto STATIC
  ${PROTO_SRCS}
)
target_include_directory(proto 【header's dir】)