如何让 CMake 在 Windows 上找到 google protobuf?

Posted

技术标签:

【中文标题】如何让 CMake 在 Windows 上找到 google protobuf?【英文标题】:How to make CMake find google protobuf on windows? 【发布时间】:2010-11-22 15:47:55 【问题描述】:

我正在使用带有 CMake 的 Google Protobuf。在 Linux 上,可以通过以下方式找到 Protobuf 库:

find_package( Protobuf REQUIRED ) 

CMake 知道在哪里查找库。我如何让它在 Windows 中工作?是否有我应该创建的环境变量,例如PROTOBUF_LIB?我查看了FindProtobuf.cmake,但无法确定需要什么。

【问题讨论】:

【参考方案1】:

我也为此苦苦挣扎。为了更清楚。

在 Windows 上(7,在旧 Windows 上类似): 开始→控制面板→系统→高级系统设置→环境变量

然后在顶部面板或底部面板(如果您希望将其应用于其他用户,请在底部执行),创建两个新变量。第一个是

CMAKE_INCLUDE_PATH 指向包含路径的底部(应包含“google”文件夹) CMAKE_LIBRARY_PATH 应包含“libprotobuf”“libprotobuf-lite”“liteprotoc”.lib 文件。

创建变量后按确定,然后重新启动 cmake(或清理缓存)。

【讨论】:

【参考方案2】:

最新的protobuf v3 具有开箱即用的 CMake 支持。

您可以使用 protobuf 存储库作为子模块,只需使用

add_subdiretory("third-party/protobuf/cmake")

获取所有 protobuf 目标。 然后您可以使用

将依赖项添加到 protobuf
target_link_libraries(YourLibrary libprotobuf libprotobuf-lite libprotoc)

另一种可能的方式可用。使用 protobuf 的 CMake 配置,您可以一次构建和安装 protobuf 二进制文件,并在开发中的多个项目中使用它们:

git clone https://github.com/google/protobuf.git
mkdir protobuf\tmp
cd protobuf\tmp
cmake ..\cmake
cmake --build .
cmake --build . --target install

然后您可以将find_package 与提示路径一起使用

find_package(protobuf REQUIRED
    HINTS
       "C:/Program Files/protobuf"
        "C:/Program Files (x86)/protobuf")
if (NOT PROTOBUF_FOUND)
    message("protobuf not found")
    return()
endif()

希望这会有所帮助。

【讨论】:

【参考方案3】:

Windows 上的 Protobuf 调用 find_library,它将搜索您的 PATH 和 LIB 变量。

【讨论】:

谢谢,后来我发现 find_library 也搜索 CMAKE_INCLUDE_PATH、CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH。【参考方案4】:

我找到了在 Windows 上将 protobuf v2 与 cmake 一起使用并使用您的项目设置构建它的方法。请尝试查看 cmake-external-packages project 和 protobuf-v2 CMakeLists 来完成这项工作。 事实上,我写它是因为ExternalProject_Add 是错误的(因为在构建阶段而不是生成阶段做事)。

此 CMakeLists.txt 将从 protobuf's github releases 下载 protobuf,提取并发出 cmake 目标,您应该使用 target_link_libraries 添加引用。

使用git-subtree、git-submodule 或仅将此存储库内容复制到您的存储库子文件夹。

然后添加您想与add_subdiretory 一起使用的包。对于 protobuf,使用:

add_subdirectory(path/to/cmake-external-packages/protobuf-v2)

Protobuf 的包含将被复制到 path/to/cmake-external-packages/include 文件夹。您可以在*** CMakeLists 中自定义其位置:

set (EXTERNAL_PACKAGES_INCLUDE_DIR $CMAKE_CURRENT_LIST_DIR/third-party/include
    CACHE STRING "Directory for third-party include files, where include folders will be copied")
include_directories($EXTERNAL_PACKAGES_INCLUDE_DIR)

只需为您的可执行文件引用 protobuf:

add_executable(your_exe $your_exe_sources)
target_link_libraries(your_exe libprotobuf libprotobuf-lite libprotoc)

希望这会有所帮助。

【讨论】:

以上是关于如何让 CMake 在 Windows 上找到 google protobuf?的主要内容,如果未能解决你的问题,请参考以下文章

如何让cmake找到CUDA

如何使用 CMAKE 从命令行在 Windows 上构建 x86 和/或 x64?

告诉 CMake 在 Windows 中哪里可以找到 z.lib

在 Windows 上运行 CMake

Windows下使用CMake进阶

在Windows上运行CMake