c++ - 在 CMake 中使用 protobuf 作为 ExternalProject
问题描述
最初我在 VCS 中有一份 protobuf 的副本,我完全不同意。我想使用 protobuf 作为我项目的外部依赖项。
只有libprotobuf.cmake
和libprotobuf-lite.cmake
是库所必需的。这些文件可以包含在这样的自定义中CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8.12)
project(protobuf C CXX)
# set protobuf_source_dir
# set protobuf_SHARED_OR_STATIC to "SHARED" or "STATIC"
include_directories(${protobuf_source_dir}/src)
include(${protobuf_source_dir}/cmake/libprotobuf-lite.cmake)
include(${protobuf_source_dir}/cmake/libprotobuf.cmake)
我听说过 CMake's ,但 CMake 抱怨它在那个项目中ExternalProject
找不到任何东西。CMakeLists.txt
解决方案
CMake 的ExternalProject假定 aCMakeLists.txt
存在于根目录中。但是,从3.4版开始的 protobuf有一些示例和一个CMakeLists.txt
in folder cmake
。
不修改外部库的示例用法:
set(PROTOBUF_TAR_GZ https://github.com/google/protobuf/archive/v3.4.0.tar.gz)
ExternalProject_Add(
protobuf-external
PREFIX protobuf
URL ${PROTOBUF_TAR_GZ}
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf
CMAKE_CACHE_ARGS
"-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
"-Dprotobuf_BUILD_TESTS:BOOL=OFF"
"-Dprotobuf_BUILD_EXAMPLES:BOOL=OFF"
"-Dprotobuf_WITH_ZLIB:BOOL=OFF"
"-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}"
# other project specific parameters
SOURCE_SUBDIR cmake
BUILD_ALWAYS 1
STEP_TARGETS build
INSTALL_COMMAND ""
)
EXternalProject_Get_Property(protobuf-external source_dir)
include_directories(${source_dir}/src)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/protobuf)
重要的部分是设置SOURCE_SUBDIR
为文件夹cmake
。
无论如何,我做了以下假设(反映在 中CMAKE_CACHE_ARGS
),但它们可以更改,目前仅作为示例配置:
- 根据项目设置构建类型。检查继承的消息时,调试可能很有用。我更喜欢Release用于外部库。
- 我不想测试protobuf。
- 我不需要示例和压缩消息。
- 如果交叉编译,可选择允许从父项目设置编译器。
推荐阅读
- c++ - 简化 GiNaC 表达式
- swift - Swift 中的不可变引用
- android - 从使用协程进行网络调用的服务内部发送广播
- lombok - 有没有办法从@EqualsAndHashCode 中排除除@Id 列之外的所有字段
- python - 使用 PyTube 获取 KeyError: 'url'
- selenium - 如何使硒cookie不会过期?(Python)
- html - 有没有办法通过点击 jquery 在引导程序中创建多个模式?
- regex - 重命名文件括号前的所有内容
- python - 无法按集群对数据点进行分组
- spring - 使用 ElasticsearchRepository 和 RestHighLevelClient 参数查询的 Spring Boot