在CMake中使用protobuf作为ExternalProject

3

最初我在版本控制系统中使用了一个protobuf的副本,但我完全不同意这样做。我想将protobuf作为我的项目的外部依赖项。

只需要libprotobuf.cmakelibprotobuf-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的ExternalProject,但CMake抱怨在该项目中找不到任何CMakeLists.txt。
1个回答

6
CMake的ExternalProject假设根目录下存在一个CMakeLists.txt。然而,protobuf在版本3.4中,在文件夹cmake中有一些示例和CMakeLists.txt
不修改外部库的情况下的一个使用示例:
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中),但它们可以更改,并且目前被视为示例配置:
  • 根据项目设置构建类型。 Debug 在检查继承消息时可能有用。我更喜欢使用Release来使用外部库。
  • 我不想测试protobuf。
  • 我不需要示例和压缩消息。
  • 如果进行交叉编译,则可以从父项目中选择设置编译器。

2
不要忘记设置工具链以匹配您的项目(如果您正在进行交叉编译)。 - Richard Hodges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接