【问题标题】:VCPKG and CMAKE not using static libraries when compiling a .exeVCPKG 和 CMAKE 在编译 .exe 时不使用静态库
【发布时间】:2022-10-23 18:32:59
【问题描述】:

我有一个使用 gRPC 的项目,并且我在 Windows 上使用 VCPKG 安装了 gRPC。我安装了 -x64-windows-static 三元组,并且在我的 CMakePresets.json 文件中设置了目标三元组,如下所示:

"name": "windows-base",
        "hidden": true,
        "generator": "Visual Studio 17 2022",
        "binaryDir": "${sourceDir}/out/build/${presetName}",
        "installDir": "${sourceDir}/out/install/${presetName}",
        "cacheVariables": {
          "CMAKE_C_COMPILER": "cl.exe",
          "CMAKE_CXX_COMPILER": "cl.exe",
          "VCPKG_TARGET_TRIPLET": "x64-windows-static",
          "CMAKE_TOOLCHAIN_FILE": {
            "value": "C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake",
            "type": "FILEPATH"
          }
        },
        "condition": {
          "type": "equals",
          "lhs": "${hostSystemName}",
          "rhs": "Windows"
        }

在此之前,使用动态库,项目构建良好,构建文件夹中填充了 .exe 和 .dll 库。我希望在这个项目中使用静态库并获得一个 .exe。使用静态三元组选项进行编译时,我只获得了 .exe 文件,但是当我运行时,我得到了几个 .dll 丢失的错误。特别是 zlib1.dll、cares.dll、re2.dll 和 abseil_dll.dll。我已经确认静态包存在于 C:\src\vcpkg\packages,所以我不确定为什么不使用它们。

我的 cmake 文件如下:

顶层:

cmake_minimum_required (VERSION 3.8)

project ("server")

set(DBUILD_SHARED_LIBS OFF)

set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")


find_package(  gRPC CONFIG REQUIRED )

find_package(Protobuf REQUIRED)

# Include sub-projects.

add_subdirectory("library")

add_subdirectory("proto")

add_subdirectory("example")

图书馆:

add_library(client_library STATIC "client_library.cpp" "client_library.h")
target_link_libraries(client_library PUBLIC proto_library gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)
target_include_directories(client_library PUBLIC "${PROJECT_SOURCE_DIR}/proto")

原型:

add_library(proto_library STATIC "example.pb.cc" "example.pb.h" "example.grpc.pb.cc" "example.grpc.pb.h")

target_link_libraries(proto_library PRIVATE gRPC::grpc++ gRPC::grpc++_reflection gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)

例子:


add_executable(example "example.cpp" "example.h")
target_link_libraries(example PRIVATE client_library proto_library)
target_include_directories(example PUBLIC "${PROJECT_SOURCE_DIR}/library")


有什么建议吗?抱歉,如果之前有人问过这个问题,但我搜索并找不到任何东西。我不知道这是 cmake 问题还是某种 vcpkg 或 Visual Studio 问题。

编辑:这是我的 vcpkg 包目录:

【问题讨论】:

  • “我已经确认静态包存在于C:\src\vcpkg\packages” - 那么,静态包 libz、abseil 的确切路径是什么? gRPC 的静态安装并不意味着它依赖库是静态的。
  • @Tsyvarev 查看 C:\src\vcpkg\packages 文件夹,我可以看到安装的每个依赖项静态库。

标签: c++ cmake grpc vcpkg


【解决方案1】:

删除您的 CMakeCache 并重试。您可能在第一次配置时未设置VCPKG_TARGET_TRIPLET,默认为x64-windows,并使find_library|file|path|program 已经找到x64-windows 的东西。由于这些都是缓存变量,因此在后续运行中不会重新找到它们!还可以考虑设置VCPKG_HOST_TRIPLET

其他的东西:
set(DBUILD_SHARED_LIBS OFF) 有错字。开头没有D!
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib") 是不必要的
cmake_minimum_required (VERSION 3.8) 考虑将其设置得更高

【讨论】:

    最近更新 更多