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

[cmake 2.x]解析protobuf模版(*.proto)并构建其C++代码

阅读更多

 

有两种方式,一种是使用cmake自带的FindProtobuf module,这个模块内部集成了生成代码命令的操作,用起来最方便;另外一种是将protoc命令集成到CMakeLists.txt中,这种要麻烦点。

 

自带的FindProtobuf

方法如下:

使用cmake自带的FindProtobuf解析protobuf

http://www.leoox.com/?p=285

 

但是我按照文章试了一遍,结果不成功,最后nmake错误时提示:

NMAKE : fatal error U1073: don't know how to make 'E:\Source\proto-build\PROTOBUF_PROTOC_EXECUTABLE-NOTFOUND'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

NMAKE : fatal error U1077: '"D:\Program_Filesx86\Microsoft Visual Studio 14.0\VC\BIN\amd64\nmake.exe"' : return code '0x2'

Stop.

可能原因:

上文是在gcc编译器下进行的,而我是在windows nmake上进行的,不知道是不是平台问题的差异。

另外我用的版本是3.5,上文用的是2.8,版本差异也可能是一个原因。

 

 

集成protoc命令来构建

cmake自动生成protobuf代码

http://www.leoox.com/?p=283

这个我还没亲自试过,不知道在nmake是否可行。

不过我手动执行protoc生成c++代码后,再执行cmake构建命令将这些C++代码编译程静态库lib是成功的。

 

注意事项:

如果proto文件中使用了import,也就是一个proto引用了另外一个proto,那么第一种方法FindProtobuf就会出错,然后你还是得中第二种方法,即将protoc命令集成到CMakeLists.txt

参考:https://argcv.com/articles/3884.c

另外import报错的问题在3.0版本已经修复,可以直接使用其内部集成的FindProtobuf直接生成,有import也能正常解析并编译:http://aigo.iteye.com/blog/2295228

 

 

其他参考:

CMake and FindProtobuf(讲的不错,提到了一些容易疏忽的cmake细节特性)

http://stackoverflow.com/questions/19343018/cmake-and-findprotobuf

 

 

最原始的手动构建方式

示例的目录结构如下:

proto-mylib

     |—— build/           #空文件夹,用于cmake编译生成

     |—— include/

                |—— google/      #protobuf头文件

     |—— lib/

                |—— libprotobuf-lite.lib  #windows静态库

     |—— src/

                |—— test.pb.h       #protoc生成代码

                |—— test.pb.cc       #protoc生成代码

     |—— CMakeLists.txt

 

CMakeLists.txt内容为(注:我这里用的是3.5,2.x版本没试过):

cmake_minimum_required(VERSION 3.5)

SET(ROOT_PATH ".")
SET(PROTOC_GEN_DIR ${ROOT_PATH}/src)
SET(THIRD_LIB_DIR ${ROOT_PATH}/lib)
SET(THIRD_INCLUDE_DIR ${ROOT_PATH}/include)


include_directories(${THIRD_INCLUDE_DIR})
link_directories(${THIRD_LIB_DIR})

file(GLOB PROTO_SRCS ${PROTOC_GEN_DIR}/*.cc)
file(GLOB PROTO_HEADERS ${PROTOC_GEN_DIR}/*.h)

add_library(proto-mylib STATIC ${PROTO_SRCS})
target_link_libraries(proto-mylib libprotobuf-lite)

 

 执行命令:

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

 

这样就得到了一个静态库:proto-mylib.lib

 

 

分享到:
评论

相关推荐

    CMake 2.8.10.1

    CMake是一款跨平台的自动化构建系统,用于管理软件构建过程。CMake 2.8.10.1是该工具的一个较旧版本,但依旧在许多项目中被使用,特别是那些需要向后兼容或者对特定功能有依赖的项目。本文将深入探讨CMake的核心功能...

    cmake-3.19.8-win64-x64.zip

    CMake是一款跨平台的自动化构建系统,用于管理软件构建过程。CMake不是一种编译器,而是一种构建工具,它可以生成适用于各种编译器和构建环境的构建文件。标题中的"cmake-3.19.8-win64-x64.zip"表明这是CMake的3.19....

    protobuf安装 编译 C++ windows平台 VS2019 CMake 3.29.0 Protobuf 3.11.4

    protobuf安装 编译 C++ windows平台 VS2019 CMake 3.29.0 Protobuf 3.11.4

    cmake-3.29.2-windows-x86-64

    1. **安装CMake**:解压“cmake-3.29.2-windows-x86_64”压缩包,并将其添加到系统的PATH环境变量中,以便在命令行中使用CMake命令。 2. **创建CMakeLists.txt**:在项目根目录下创建此文件,定义项目的基本信息和...

    CMakeList.txt编写技巧

    CMake是一种跨平台的构建系统,它通过CMakeLists.txt文件来管理项目构建。这篇关于"CMakeList.txt编写技巧"的文章旨在帮助开发者更好地理解和利用这一工具,提高项目的可移植性和构建效率。 首先,CMakeLists.txt是...

    cmake2.8.2.zip

    CMake是一款跨平台的自动化构建系统,用于管理软件构建过程。CMake不是直接进行编译和链接的工具,而是生成特定平台的构建文件,如Unix的makefile或Windows的Visual Studio项目文件。CMake的目的是简化多平台项目...

    cmake-3.19.4.tar.gz

    总之,"cmake-3.19.4.tar.gz"文件是一个包含CMake 3.19.4版本源代码的压缩包,适合于开发者或系统管理员在Unix/Linux环境中下载、编译和安装CMake,以便利用其强大的跨平台构建能力管理自己的软件项目。

    cmake-3.19.6.tar.gz

    CMake是一种跨平台的开源构建系统,...通过学习和研究CMake的源代码,开发者可以深入理解其内部工作原理,定制自己的构建流程,或者为CMake贡献代码。同时,了解CMake可以帮助你更有效地管理大型的、跨平台的软件项目。

    protobuf source v3.21.12

    1. **模式解析**:了解protobuf如何将.proto文件解析为抽象语法树(AST)并生成目标语言的代码。 2. **编码和解码算法**:深入理解protobuf如何高效地编码和解码数据,包括变长整数编码(Varint)、长度前缀编码等。...

    cmake-3.16.6-win64-x64.zip

    CMake并不直接执行编译,而是生成特定平台的构建文件,如Visual Studio的解决方案文件或Unix Makefiles,然后用户可以使用这些生成的文件进行编译。`cmake-3.16.6-win64-x64.zip` 是CMake的一个预编译版本,针对...

    cmake-3.22.2 Linux 安装包

    CMake-3.22.2 是 CMake 的一个稳定版本,包含了多项改进和修复,以提高用户体验和构建效率。 在Linux环境下安装CMake-3.22.2的步骤通常如下: 1. **下载与解压**:首先,你需要从官方网站或者通过命令行下载 cmake...

    cmake-3.20.5.tar.gz

    CMake并不直接执行构建,而是生成针对特定编译器和构建工具的构建文件,如Unix的makefile或Visual Studio的解决方案文件。 在"cmake-3.20.5.tar.gz"这个文件中,我们可以预见到包含了CMake版本3.20.5的所有源代码、...

    cmake-3.21.2.tar.gz

    在标题中提到的"cmake-3.21.2.tar.gz"是一个CMake的源代码包,版本为3.21.2。这个文件是使用gzip压缩的tar归档文件,常见于Linux和类Unix系统。在Linux环境下,你可以使用以下命令来解压并提取文件: ```bash tar -...

    cmake-2.8.7.tar.gz

    1. **源代码**:所有CMake源代码文件,包括C++源码、头文件以及脚本。这些文件允许用户查看、修改和扩展CMake的功能。 2. **文档**:可能包含CMake的离线文档,如HTML格式的手册页,帮助用户理解如何使用CMake语法...

    cmake-3.26.5-windows-x86-64

    2. **生成构建系统**:接着,运行`cmake`命令行工具,指定源代码目录(包含`CMakeLists.txt`的目录)和目标构建目录。CMake会根据`CMakeLists.txt`的内容生成对应构建工具的项目文件,比如Visual Studio解决方案(`....

    cmake-3.29.0-rc2.zip

    CMake并不直接进行编译和构建,而是生成针对特定构建工具(如Make、Visual Studio、Ninja等)的输入文件,然后由这些工具执行实际的构建工作。 CMake的版本“3.29.0-rc2”代表这是一个3.29.0版本的候选发布2...

    cmake-2.8.12.1.tar.gz

    CMake并不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件。在本例中,我们关注的是CMake的2.8.12.1版本,它是一个tar.gz压缩包。 1. **CMake的基本概念** - **CMakeLists....

    cmake-3.11.1.zip

    CMake并不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件。CMake的语法简洁且易于理解,使得开发者可以在不同的操作系统和编译器之间轻松切换。 在你提供的`cmake-3.11.1.zip...

    cmake-2.8.5.tar.gz

    MySQL 5.5是数据库管理系统的一个旧版本,它依赖于特定版本的CMake来配置和构建其源代码,这就是为什么在编译安装过程中会特别指出需要`cmake-2.8.5.tar.gz`的原因。 首先,让我们深入了解CMake的工作原理。CMake并...

    cmake-3.19.4-win64-x64.zip

    CMake是一个跨平台的自动化构建系统,用于管理软件构建过程。它使用一种名为CMakeLists.txt的文本文件来描述构建规则,并能生成平台特定的构建工具(如Microsoft Visual Studio、Unix Makefiles等)所需的项目文件。...

Global site tag (gtag.js) - Google Analytics