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

时间:2010-11-22 15:47:55

标签: cmake protocol-buffers

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

find_package( Protobuf REQUIRED ) 

CMake知道在哪里寻找图书馆。我怎么能在Windows中使用它?我应该创建一个环境变量,例如PROTOBUF_LIB吗?我查看了FindProtobuf.cmake,但无法确定所需要的内容。

4 个答案:

答案 0 :(得分:7)

我也很努力。更清楚。

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

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

最新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 :(得分:0)

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

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

使用git-subtreegit-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)

希望这有帮助。