【发布时间】: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 问题。
【问题讨论】:
-
“我已经确认静态包存在于
C:\src\vcpkg\packages” - 那么,静态包 libz、abseil 的确切路径是什么? gRPC 的静态安装并不意味着它依赖库是静态的。 -
@Tsyvarev 查看 C:\src\vcpkg\packages 文件夹,我可以看到安装的每个依赖项静态库。