cmake - 为什么下面的CMakeLists.txt不能生成*.proto(protobuf)系列的输出文件
问题描述
我不熟悉 cmake 和 protobuf。我想编写一个 CMakeLists.txt 来帮助我将指定目录中的所有 protobuf 文件生成到另一个指定目录中。
下面是我写的CMakeLists.txt,但是现在不能生成任何*.pb.h或者*.pb.cc。谁能告诉我我的 CMakeLists.txt 有什么问题?谢谢。
我使用的cmake版本是3.12,protoc版本是3.12。
file(GLOB_RECURSE children LIST_DIRECTORIES true "${CMAKE_CURRENT_SOURCE_DIR}/protos/*.proto")
SET(PROTO_META_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp)
FOREACH(FIL ${children})
GET_FILENAME_COMPONENT(ABS_FIL ${FIL} ABSOLUTE)
GET_FILENAME_COMPONENT(FIL_WE ${FIL} NAME_WE)
LIST(APPEND PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp/${FIL_WE}.pb.cc")
LIST(APPEND PROTO_HDRS "${CMAKE_CURRENT_BINARY_DIR}/protos_cpp_hpp/${FIL_WE}.pb.h")
# EXECUTE_PROCESS(
# COMMAND PROTOBUF_GENERATE_CPP --cpp_out=${PROTO_META_BASE_DIR} ${FIL}
# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/protos
# )
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HDR ${CMAKE_SOURCE_DIR}/protos/${FIL})
ENDFOREACH()
解决方案
根据文档,函数PROTOBUF_GENERATE_CPP创建一个自定义命令,OUTPUT
列出结果文件。因此,除非存在将这些文件作为依赖项使用的目标,否则不会生成任何内容。
最直接的方法是使用文件作为源add_executable
:
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
这种方式在文档中有所描述。
如果出于某种原因,您不想从结果文件中创建任何内容,那么您可以创建一个使用这些文件的自定义目标:
add_custom_target(my_command ALL DEPENDS ${PROTO_SRCS} ${PROTO_HDRS})
推荐阅读
- android - 按下后退按钮后如何防止重新启动特定活动?
- solr - 使用 facet.exists=true 与 solr 中的特定术语进行分面
- android - 打开“navigation.xml”文件时,Android Studio 不断崩溃
- swift - 如何在我的 Package.swift 文件中添加对 RealmSwift 的依赖项?
- amazon-web-services - AWS IAM 策略根据父 Cloudformation 限制对资源的访问
- python - 我如何始终运行此检查
- linux - Pulseaudio - 如何将多个通道多路复用为一个?
- php - 用户名正确但密码错误它不会重定向
- node.js - 节点 - Knex 作为连接表的结果返回对象数组
- docusignapi - Docusign 签名字段未显示