`
aigo
  • 浏览: 2635110 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

[cmake 3.5]使用自身集成的FindProtobuf来生成并构建proto代码

阅读更多

 

使用FindProtobuf,可以不用手动执行protoc命令,nmake的时候自动去执行protoc,然后再编译链接生成静态库。如果proto文件之间有相互引用(使用了import),貌似会有问题,这个不知道当前版修复没,后面有空再测。

 

目录结构:

/proto-build

     |—— build/           #empty, used for cmake building

     |—— include/

              |—— google/      #protobuf headers

     |—— proto/

              |—— test.proto

     |—— CMakeLists.txt

     |—— protoc.exe

/protoc.exe

 

这里有两个protoc.exe:一个在proto-build内部,一个与proto-build同级。至于为什么,我也不清楚。。反正少其中一个就会提示找不到protoc.exe,不清楚是其他参数没设置正确,还是cmake的bug。这个问题折腾了整整半天,一会正常一会又不正常。

 

CMakeLists.txt

注:仅适用于3.x版本,2.x版本不适用

 

cmake_minimum_required(VERSION 3.5)

set(CMAKE_VERBOSE_MAKEFILE ON)

SET(ROOT_PATH ".")
SET(PROTO_DIR ${ROOT_PATH}/proto)


#PROTOBUF_INCLUDE_DIR和PROTOBUF_LIBRARY两个变量必须设置,貌似可以随便设置,不设置但会提示让你设置,感觉像是bug
SET(PROTOBUF_INCLUDE_DIR include)	
SET(PROTOBUF_LIBRARY .)	

SET(PROTOBUF_PROTOC_EXECUTABLE ../protoc.exe)

#指向protobuf头文件的目录,里面的上层目录是<google>
SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include)

#包含protobuf头文件,这里必须设置,如果将PROTOBUF_INCLUDE_DIR指向protobuf头文件,而不设置include_directories,也会报错。
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(mylib STATIC ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(mylib)

 

 

执行命令:

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

nmake

 

或者使用下面的批处理:

RD mylib\build\ /s /q

mkdir mylib\build\



call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars64.bat"



cd /D E:\mylib\build\



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

nmake

 

 2017-12更新:

CMake的FindProtobuf对protobuf3.x无效,只对2.x版本有效。

分享到:
评论

相关推荐

    windows 32位 CMake3.5.txt

    windows 32位cmake3.5安装包下载(该文件包含了安装包的下载链接)

    linux CMake3.5.txt

    linux系统cmake3.5安装包下载 (该文件包含了安装包的下载链接)

    cmake-3.5.1.tar.gz

    2. **跨平台**:CMake可以生成针对不同平台的构建系统,如Unix Makefiles、Xcode项目、Visual Studio解决方案等。 3. **编译器选择**:CMake允许用户指定编译器,支持GCC、Clang、MSVC等多种编译器。 4. **依赖管理*...

    Cmake编译OsgEarth3.5的库

    总结来说,编译 OSGEarth 3.5 要求对 CMake 和相关依赖库有深入理解,同时注意构建环境的配置。通过以上步骤,你可以成功构建包含 OSGEarth 的库,但不包括 OSG 和其他依赖库。这可能适用于特定的项目需求,例如只...

    cmake-3.5.0-rc1-win32-x86.msi

    cmake-3.5.0-rc1-win32-x86.msi windows下的cmake安装包,最新版,

    cmake-3.5.2

    5. **构建与安装**:`make`命令将编译源代码并生成目标文件,之后运行`make install`将MySQL安装到指定的位置。 关于MySQL的安装: 1. **获取源代码**:从MySQL官方网站下载源代码包,解压到本地。 2. **依赖库**...

    Darwin CMake3.5.txt

    Darwin系统 make3.5安装包下载(该文件包含了安装包的下载链接)

    proto与cmakelists结合进行编译编程

    在"proto与cmakelists结合进行编译编程"这个主题中,我们将探讨如何使用CMakeLists.txt文件来配置protobuf的编译过程,并将生成的代码集成到C++项目中。 首先,你需要安装protobuf库,这通常包括protoc编译器和对应...

    使用vscode cmake插件构建的CMake工程模板

    本教程将详细讲解如何使用VSCode的CMake插件来构建CMake工程模板。 首先,确保你已经安装了VSCode和CMake。VSCode可以从官方网站下载,CMake可以在其官网或通过操作系统自带的包管理器进行安装。同时,确保安装了...

    cmake 指定输出路径和生成多个so案例

    在IT行业中,CMake是一个广泛使用的跨平台构建系统,它允许开发者通过简单的配置文件来管理项目的构建过程。本文将深入探讨如何使用CMake指定输出路径以及生成多个动态链接库(SO,即Shared Object,在Linux环境下)...

    给出了TC397 Tasking CMake Gitlab集成使工程可以命令行编译 CI CD的最小工程

    TC397 Tasking CMake Gitlab集成是一个用于构建C++项目的重要框架,它使得开发者能够在命令行环境中轻松地进行编译,并实现持续集成(CI)和持续部署(CD)的过程。这个最小工程包含了所有必要的组件,以确保开发...

    cmake代码生成工具

    标题"cmake代码生成工具"指的是利用CMake来生成适用于特定IDE的项目文件,以便于开发人员进行编辑、构建和调试。在本例中,描述中提到的“sln文件”是Visual Studio使用的解决方案文件,用于组织一个或多个项目,并...

    ios使用cmake编译framework

    本篇文章将深入探讨如何使用CMake构建iOS框架(framework),并介绍相关的关键知识点。 首先,我们来理解“iOS.cmake”——这是一个工具链文件(toolchain file)。在CMake中,工具链文件用于指定特定平台的编译器...

    cmake-cmake使用示例之生成动态库.zip

    在本文中,我们将深入探讨如何使用CMake来生成动态库,这对于那些希望将代码库作为库文件供其他程序使用的开发者来说非常重要。 ### CMake简介 CMake不是直接构建工具,而是生成构建文件的工具,如Unix下的...

    CMake构建OpenGL项目

    本篇将详细介绍如何利用CMake来构建一个依赖于glfw、glew、glm以及OpenGL核心库的项目。 首先,CMake是一个开源的、跨平台的自动化构建系统,它的目标是管理项目源代码的编译过程。通过使用CMake,开发者可以编写...

    cmake-3.5.0-win32-x86.msi

    cmake安装包

    Vcxproj2CMake

    - **IDE集成**:CMake支持多种IDE的集成,如Visual Studio、CLion、Eclipse等,方便开发者选择自己喜欢的开发环境。 - **自动化配置**:CMakeLists.txt可以自动处理依赖库的查找和链接,减少手动配置的工作量。 *...

    cmake学习相关的代码

    6. **CMake模块和自定义函数**:CMake支持创建模块(`.cmake`文件)来封装重复使用的代码或提供平台特定的功能。此外,可以定义自定义的CMake函数来增加代码的可读性和可维护性。 7. **构建配置**:CMake支持多种...

    eigen3(cmake VS生成)

    标题中的“eigen3(cmake VS生成)”指的是在Visual Studio 2013环境下,通过CMake工具来编译和构建Eigen3库的过程。Eigen3是一个C++模板库,主要用于处理多维数组和矩阵运算,广泛应用于数值计算、机器学习、计算机...

    (cmake最全的书)cmake.pdf

    cmake是当前流行的构建自动化工具之一,该书从基础到高级,对cmake的安装、配置、使用进行了详细的介绍。下面是cmake大全的知识点总结: cmake安装 cmake的安装非常简单,只需要下载并安装相应的安装包即可。cmake...

Global site tag (gtag.js) - Google Analytics