如何让 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 目标。 然后您可以使用
将依赖项添加到 protobuftarget_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 从命令行在 Windows 上构建 x86 和/或 x64?