CMake动态编译protobuff

本文详细介绍了在CMake3.14.6和protobuf3.9.1环境下,如何解决动态编译.proto文件的问题。通过设置环境变量Protobuf_INCLUDE_DIR和Protobuf_LIBRARY,以及在CMakeLists.txt中正确调用protobuf_generate_cpp命令,实现Protobuf与CMake的无缝集成。

原文地址:http://www.funlim.com/showthread.php?tid=10

CMake对protobuff支持不是很好,想要动态编译.proto文件,不是那么容易的。
本文适用CMake3.14.6  protobuf3.9.1  centos7.4
网上搜索,CMake提供如下命令支持PB
1 find_package(Protobuf REQUIRED)
2 protobuf_generate_cpp
CMakeLists.txt中加入,于是各种未定义和找不到的错误。如:
Could NOT find Protobuf (missing: Protobuf_INCLUDE_DIR)
Unknow CMake command "protobuf_generate_cpp"
然后网上各种支招,有打开兼容性开关什么的,最后发现都没用的,只能自己想尽办法处理,把处理方法记录下来: 
CMake3并不能自动找到Protobuff安装的位置,即使在path和C_INCLUDE_PATH环境变量中配置了也没用。
需要在CMakeLists.txt明确指定路径,依赖于以下2个变量Protobuf_INCLUDE_DIR、Protobuf_LIBRARY:
SET(Protobuf_INCLUDE_DIR /usr/local/protobuf/include/)
SET(Protobuf_LIBRARY /usr/local/protobuf/lib/)
 
但是我的代码是对外开源的,总不能让每个用户都配置一下这个,所以把路径设置到~/.bash_profile
export Protobuf_INCLUDE_DIR=/usr/local/protobuf/include/
export Protobuf_LIBRARY=/usr/local/protobuf/lib/

 CMakeLists.txt中的内容变成:
SET(Protobuf_INCLUDE_DIR $ENV{Protobuf_INCLUDE_DIR})
SET(Protobuf_LIBRARY $ENV{Protobuf_LIBRARY})
find_package(Protobuf REQUIRED)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ./src/ccc.proto)

### 使用 CMake 4.0 编译动态库的方法或配置 CMake 是一个强大的跨平台构建工具,能够生成各种平台的构建文件。使用 CMake 4.0 编译动态库的过程包括定义项目、指定源文件、设置目标类型以及链接必要的库等步骤。以下是详细说明: #### 1. 定义 CMakeLists.txt 文件 在 CMake 中,所有的构建配置都通过 `CMakeLists.txt` 文件完成。以下是一个典型的用于编译动态库的 `CMakeLists.txt` 配置示例[^4]。 ```cmake # 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.4) # 注意:这里需要与实际使用的 CMake 版本匹配 # 定义项目名称和语言 project(MyDynamicLibrary LANGUAGES CXX) # 添加可执行文件或库的目标 add_library(mylib SHARED src/mylib.cpp) # 设置头文件路径(如果需要) target_include_directories(mylib PUBLIC ${CMAKE_SOURCE_DIR}/include) # 链接其他库(如果有依赖) find_package(Threads REQUIRED) target_link_libraries(mylib PRIVATE Threads::Threads) # 设置输出路径(可选) set_target_properties(mylib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) ``` #### 2. 配置动态库的查找路径 当项目中需要引用多个动态库时,可以简化配置以避免冗长的 `add_library` 和 `set_target_properties` 调用。例如,可以通过 `link_directories` 和 `file(GLOB ...)` 来批量处理动态库[^5]。 ```cmake # 设置动态库的查找路径 set(LINK_DIR ${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}) link_directories(${LINK_DIR}) # 批量获取所有 .so 文件 file(GLOB SO_FILES ${LINK_DIR}/*.so) # 链接动态库到目标 target_link_libraries(mylib ${SO_FILES}) ``` #### 3. 构建动态库 在完成 `CMakeLists.txt` 的编写后,可以通过以下命令生成构建系统并编译动态库: ```bash # 创建构建目录 mkdir build && cd build # 生成构建文件 cmake .. -DCMAKE_BUILD_TYPE=Release # 编译动态库 make -j$(nproc) ``` #### 4. 环境变量配置 如果动态库是通过本地源码编译生成的,可能需要将动态库路径添加到环境变量中,以便运行时能够正确加载动态库[^3]。可以通过以下方式设置环境变量: ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/libs ``` #### 5. 动态库的使用 生成的动态库通常位于 `build/lib` 目录下(根据 `LIBRARY_OUTPUT_DIRECTORY` 设置)。可以通过以下方式在其他项目中引入动态库: - 将 `.so` 文件复制到项目的 `libs` 目录。 - 在 CMakeLists.txt 中通过 `find_library` 或 `link_directories` 引入动态库。 --- ### 注意事项 - 确保 CMake 版本与项目需求一致。如果使用的是 CMake 4.0,需注意其功能限制和兼容性问题。 - 如果在 Android 平台上编译动态库,需要结合 NDK 和 CMake 进行配置[^1]。 - 当引用多个动态库时,建议使用批量配置方法以减少重复代码[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值