protobuf cmake Visual Studio 编译安装 (全命令行)

news/2024/11/15 15:20:22/文章来源:https://www.cnblogs.com/aquawius/p/18409372

protobuf cmake Visual Studio 编译安装

中间踩了挺多的坑的, 这篇文章记录一下.

重要前言: 所有在引用框中的命令都不要输入!!
cmake --install .			# 在引用框中的不要输入到命令行
cmake --install . --config Debug		# 命令没有被引用框包裹, 需要输入到命令行中

0x00 环境配置

vs2022, git, cmake

0x01 源代码下载

注意: 建议使用git clone的方式下载, 如果是通过github的Release下载的, 你得手动的配置protobuf的三方依赖.

git clone -b v28.0 https://github.com/protocolbuffers/protobuf-28.0.git

这里v28.0是版本号(本质是一个tag)

通过git submodule下载protobuf第三方依赖.

git submodule update --init --recursive
cd protobuf-28.0

cmake编译前的配置

在项目中建立一个临时编译目录, (我这里使用的是powershell可使用mkdir, 如果你没有mkdir命令, windows创建文件夹的命令是md)

mkdir cmake_build
cd cmake_build

cmake指定源码位置和编译位置(我这里优先使用命令的方式, 如果需要图形化的方式(cmake-gui)也有说明)

cmake -S .. -B . -L

-S 指定source目录, -B 执行build目录, -L 查看项目的一些编译选项

PS C:\code_dependencies\protobuf-28.0\cmake_build> git submodule update --init --recursive
....................
Submodule path '../third_party/abseil-cpp': checked out '4a2c63365eff8823a5221db86ef490e828306f9d'
Submodule path '../third_party/googletest': checked out '4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774'
Submodule path '../third_party/jsoncpp': checked out '9059f5cad030ba11d37818847443a53918c327b1'PS C:\code_dependencies\protobuf-28.0\cmake_build> cmake -S .. -B . -L
-- Selecting Windows SDK version 10.0.26100.0 to target Windows 10.0.19045.
--
-- 28.0.0
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
CMake Warning at third_party/abseil-cpp/CMakeLists.txt:82 (message):A future Abseil release will default ABSL_PROPAGATE_CXX_STD to ON for CMake3.8 and up.  We recommend enabling this option to ensure your project stillbuilds correctly.-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX17
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX17 - Failed
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX20
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX20 - Failed
-- Configuring done (1.5s)
CMake Error at third_party/abseil-cpp/CMake/AbseilHelpers.cmake:317 (target_link_libraries):The link interface of target "random_mocking_bit_gen" contains:absl::random_internal_mock_overload_setbut the target was not found.  Possible reasons include:* There is a typo in the target name.* A find_package call is missing for an IMPORTED target.* An ALIAS target is missing.Call Stack (most recent call first):third_party/abseil-cpp/absl/random/CMakeLists.txt:100 (absl_cc_library)-- Generating done (2.3s)
CMake Generate step failed.  Build files cannot be regenerated correctly.
-- Cache values
ABSL_BUILD_TESTING:BOOL=OFF
ABSL_FIND_GOOGLETEST:BOOL=OFF
ABSL_GOOGLETEST_DOWNLOAD_URL:STRING=
ABSL_LOCAL_GOOGLETEST_DIR:PATH=/usr/src/googletest
ABSL_PROPAGATE_CXX_STD:BOOL=OFF
ABSL_USE_GOOGLETEST_HEAD:BOOL=OFF
ABSL_USE_SYSTEM_INCLUDES:BOOL=OFF
BUILD_TESTING:BOOL=ON
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
CMAKE_INSTALL_PREFIX:PATH=C:/Program Files (x86)/protobuf
EXECINFO_LIBRARY:FILEPATH=EXECINFO_LIBRARY-NOTFOUND
LIBRT:FILEPATH=LIBRT-NOTFOUND
protobuf_ABSL_PROVIDER:STRING=module
protobuf_ALLOW_CCACHE:BOOL=OFF
protobuf_BUILD_CONFORMANCE:BOOL=OFF
protobuf_BUILD_EXAMPLES:BOOL=OFF
..........

如果你想调整编译选项的开关, 请使用-D选项指定Key=Value, 命令执行过后, 可以不用重复执行.

例如下面的命令指定(在引用框中的不要输入到命令行)

cmake -S .. -B . -Dprotobuf_BUILD_SHARED_LIBS=ON -Dprotobuf_USE_EXTERNAL_GTEST=OFF -Dprotobuf_WITH_ZLIB=OFF

我的配置是这样的, 你可以按需修改. (后面的`符号是powershell的换行输入字符, 如果你是linux, 请替换成\)

cmake -S .. -B .    `
-DABSL_PROPAGATE_CXX_STD=ON   `
-DCMAKE_INSTALL_PREFIX="C:\code_dependencies\protobuf"   `
-Dprotobuf_BUILD_EXAMPLES=ON   `
-Dprotobuf_BUILD_LIBPROTOC=ON   `
-Dprotobuf_BUILD_LIBUPB=OFF   `
-Dprotobuf_BUILD_PROTOBUF_BINARIES=ON   `
-Dprotobuf_BUILD_PROTOC_BINARIES=ON   `
-Dprotobuf_BUILD_SHARED_LIBS=ON   `
-Dprotobuf_BUILD_TESTS=ON   `
-Dprotobuf_INSTALL=ON   `
-Dprotobuf_INSTALL_EXAMPLES=ON   `
-Dprotobuf_MSVC_STATIC_RUNTIME=ON   `
-Dprotobuf_WITH_ZLIB=OFF   `
-Dutf8_range_ENABLE_INSTALL=ON   `
-L     `

执行结果如下

PS C:\code_dependencies\protobuf-28.0\cmake_build> cmake -S .. -B .    `
>> -DABSL_PROPAGATE_CXX_STD=ON   `
>> -DCMAKE_INSTALL_PREFIX="C:\code_dependencies\protobuf"   `
>> -Dprotobuf_BUILD_EXAMPLES=ON   `
>> -Dprotobuf_BUILD_LIBPROTOC=ON   `
>> -Dprotobuf_BUILD_LIBUPB=OFF   `
>> -Dprotobuf_BUILD_PROTOBUF_BINARIES=ON   `
>> -Dprotobuf_BUILD_PROTOC_BINARIES=ON   `
>> -Dprotobuf_BUILD_SHARED_LIBS=ON   `
>> -Dprotobuf_BUILD_TESTS=ON   `
>> -Dprotobuf_INSTALL=ON   `
>> -Dprotobuf_INSTALL_EXAMPLES=ON   `
>> -Dprotobuf_MSVC_STATIC_RUNTIME=ON   `
>> -Dprotobuf_WITH_ZLIB=OFF   `
>> -Dutf8_range_ENABLE_INSTALL=ON   `
>> -L     `
>>
-- Selecting Windows SDK version 10.0.26100.0 to target Windows 10.0.19045.
--
-- 28.0.0
-- Configuring done (0.5s)
-- Generating done (1.1s)
-- Build files have been written to: C:/code_dependencies/protobuf-28.0/cmake_build
-- Cache values
ABSL_BUILD_TESTING:BOOL=OFF
ABSL_FIND_GOOGLETEST:BOOL=OFF
ABSL_GOOGLETEST_DOWNLOAD_URL:STRING=
ABSL_LOCAL_GOOGLETEST_DIR:PATH=/usr/src/googletest
ABSL_PROPAGATE_CXX_STD:BOOL=ON
ABSL_USE_GOOGLETEST_HEAD:BOOL=OFF
ABSL_USE_SYSTEM_INCLUDES:BOOL=OFF
BUILD_TESTING:BOOL=ON
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
CMAKE_INSTALL_PREFIX:PATH=C:/code_dependencies/protobuf
EXECINFO_LIBRARY:FILEPATH=EXECINFO_LIBRARY-NOTFOUND
GTest_DIR:PATH=GTest_DIR-NOTFOUND
LIBRT:FILEPATH=LIBRT-NOTFOUND
protobuf_ABSL_PROVIDER:STRING=module
protobuf_ALLOW_CCACHE:BOOL=OFF
protobuf_BUILD_CONFORMANCE:BOOL=OFF
protobuf_BUILD_EXAMPLES:BOOL=ON
protobuf_BUILD_LIBPROTOC:BOOL=ON
protobuf_BUILD_LIBUPB:BOOL=OFF
protobuf_BUILD_PROTOBUF_BINARIES:BOOL=ON
protobuf_BUILD_PROTOC_BINARIES:BOOL=ON
protobuf_BUILD_SHARED_LIBS:BOOL=ON
protobuf_BUILD_TESTS:BOOL=ON
protobuf_DISABLE_RTTI:BOOL=OFF
protobuf_INSTALL:BOOL=ON
protobuf_INSTALL_EXAMPLES:BOOL=ON
protobuf_JSONCPP_PROVIDER:STRING=module
protobuf_REMOVE_INSTALLED_HEADERS:BOOL=OFF
protobuf_TEST_XML_OUTDIR:BOOL=OFF
protobuf_USE_EXTERNAL_GTEST:BOOL=OFF
protobuf_USE_UNITY_BUILD:BOOL=OFF
protobuf_WITH_ZLIB:BOOL=OFF
utf8_range_ENABLE_INSTALL:BOOL=ON
utf8_range_ENABLE_TESTS:BOOL=OFF

当然你也可以使用cmake-gui图形化的方式(我个人觉得没有命令行装逼), 这里简单提一嘴

先点击Configure, 然后选中你需要的组件, 最后点击Generate.

0x03 开始编译

cmake --build . --config Debug --target ALL_BUILD		# 你可以选择Release或者Debug

注意: 这里似乎不能加-j指定编译的线程数量, 会报文件重复征用的错误.

这里优先使用命令行, 如果你觉得不适应, 在cmake_build(也就是当前目录), 有.sln项目文件, 通过VS打开它, 编译ALL_BUILD解决方案.

经过一段时间的编译, 将他安装在你在前面指定的安装路径中 (CMAKE_INSTALL_PREFIX="C:\code_dependencies\protobuf")

 cmake --install . --config Debug		# 需要和上面的Release或者Debug相同, 
cmake --install .           # 这里有坑, 在引用框中的不要输入到命令行

默认是的config是Release, 如果你编译的是Debug, 但是没有指定--config Debug会出现问题(编译后文件找不到)

CMake Error at third_party/abseil-cpp/absl/cmake_install.cmake:55 (file):
file INSTALL cannot find
"C:/code_dependencies/protobuf-28.0/cmake_build/bin/Release/abseil_dll.dll":
File exists.
Call Stack (most recent call first):
third_party/abseil-cpp/cmake_install.cmake:85 (include)
cmake_install.cmake:37 (include)

cmake --install . --config Debug install过程

PS C:\code_dependencies\protobuf-28.0\cmake_build> cmake --install . --config Debug
-- Installing: C:/code_dependencies/protobuf/lib/cmake/absl/abslTargets.cmake
-- Installing: C:/code_dependencies/protobuf/lib/cmake/absl/abslTargets-debug.cmake
-- Installing: C:/code_dependencies/protobuf/lib/cmake/absl/abslConfig.cmake
-- Installing: C:/code_dependencies/protobuf/lib/cmake/absl/abslConfigVersion.cmake
-- Installing: C:/code_dependencies/protobuf/include/absl
-- Installing: C:/code_dependencies/protobuf/include/absl/algorithm
............
............
............
-- Installing: C:/code_dependencies/protobuf/share/protobuf/examples/MODULE.bazel
-- Installing: C:/code_dependencies/protobuf/share/protobuf/examples/pubspec.yaml
-- Installing: C:/code_dependencies/protobuf/share/protobuf/examples/README.md
-- Installing: C:/code_dependencies/protobuf/share/protobuf/examples/WORKSPACE
-- Installing: C:/code_dependencies/protobuf/share/protobuf/examples/WORKSPACE.bzlmod
-- Installing: C:/code_dependencies/protobuf/lib/gmock.lib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795782.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陈彦吉的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 向教师和助教介绍自己,阐述自己期望的课程收获和扮演的课程实践角色姓名-学号 陈彦吉 2022329301139一、自我介绍 (一)基本信息 我叫陈彦吉,来自浙江台州,是2022级电气工程及其自动化(2)班…

(16)USB通信

USB协议讲解(大范围讲解) USB,英文全称 Universal Serial Bus(通用串行总线),是一种支持热插拔的高速串行传输总线(目前已发展至3.0) USB体系包括主机、设备以及物理连接三部分,其中: 主机是一个提供USB接口以及接口管理能力的硬件、软件及固件复合体,可以使PC,也可…

Redis 入门 - C#|.NET Core客户端库六种选择

介绍了6款.NET系Redis客户端库:ServiceStack.Redis、StackExchange.Redis、CSRedisCore、FreeRedis、NewLife.Redis、BeetleX.Redis,各具特色,如商业支持、高性能、高并发、低延迟等,适合不同场景和需求。经过前面的Redis基础学习,今天正式进入编码阶段了,进入编码阶段我…

[NLP] 知识抽取技术

1 概述:知识抽取 定义知识抽取通常指从非结构化文本中挖掘结构化信息。例如,含有丰富语义信息的标签和短语。 这在业界被广泛应用于内容理解和商品理解等场景,通过从用户生成的文本信息中提取有价值的标签,将其应用于内容或商品上知识抽取通常伴随着对所抽取标签或短语的分…

如何用 Scrapy 爬取网站数据并在 Easysearch 中进行存储检索分析

做过数据分析和爬虫程序的小伙伴想必对 Scrapy 这个爬虫框架已经很熟悉了。今天给大家介绍下,如何基于 Scrapy 快速编写一个爬虫程序并利用 Easysearch 储存、检索、分析爬取的数据。我们以极限科技的官网 Blog 为数据源,做下实操演示。 安装 scrapy 使用 Scrapy 可以快速构建…

个人项目—论文查重

个人项目———论文查重这个作业属于哪个课程 计科12班这个作业的要求在哪里 作业要求这个作业的目标 实现论文查重,给定原文件和抄袭的文件,输出二者的相似度到答案文件中GitHub链接:github 1.题目要求 题目:论文查重 描述如下: 设计一个论文查重算法,给出一个原文文件和…

一款用于Redis漏洞的利用工具

Hack分享吧声明 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。工具介绍 @yuyan-sec使用golang写的一款Redis漏洞利用工具。 注意:主从复制会清空数据,主从复制会清空数据…

AGC007F Shik and Copying String

涉及知识点:Ad-hoc,贪心 题意 Link 给出两个长度相同的字符串 \(S,T\),定义一次操作为: 从头至尾处理每一位,每位可以变成上一位,或者不变。 求最少对 \(S\) 进行多少次操作使得 \(S=T\)。 思路 引理 可以发现,一次操作其实类似于选择一些点 \(l\),从左到右覆盖它后面的…

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法。这种模式在 Python 中广泛应用于事件处理、异步编程、函数式编程等场景。全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback摘要: 回调函数是编程中一种非常常见的…

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One Kindle 电子书如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In OneKindle 电子书https://www.bilibili.com/video/BV1nY4y1e7gC/?t=375 demosKindle Paperwhite 7 电子书阅读器(4GB)Kindle Paperwhi…

基于小波神经网络的数据分类算法matlab仿真

1.程序功能描述 基于小波神经网络的数据分类算法。输入为5个特征值,输出为判断(是,否)。拿50组数据对本算法作为训练组,后30组数据作为验证组。这里,我们首先调用数据,然后对50组数据进行训练,然后对30组数据进行识别测试。 2.测试软件版本以及运行结果展示MATL…

基于GWO灰狼优化的CNN-LSTM的时间序列回归预测matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = Alpx(1); numHiddenUnits1 = floor(Alpx(2))+1;% 定义隐藏层中LSTM单元的数量 numHiddenUnits2 = floor(Alpx(3)…