使用vcpkg安装etcd-cpp-apiv3后运行项目遇pplx报错求助
环境与配置
- 系统:Windows 64位
- 开发环境:CLion
- 依赖安装:通过vcpkg执行
vcpkg install etcd-cpp-apiv3:x64-windows完成etcd-cpp-apiv3库安装 - CMake配置:
set(VCPKG_ROOT "C:/vcpkg") set(VCPKG_TARGET_TRIPLET "x64-windows") set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake") set(CMAKE_PREFIX_PATH "${VCPKG_ROOT}/installed/x64-windows") include_directories(${CMAKE_PREFIX_PATH}/include) find_package(etcd-cpp-api CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE etcd-cpp-api)
问题现象
项目可正常识别#include <etcd/Client.hpp>语句,但编译时出现大量来自vcpkg安装目录下pplx头文件的报错,核心报错示例:
C:/vcpkg/installed/x64-windows/include/pplx/pplxtasks.h:2877:21: error: '_ASSERTE' was not declared in this scopeIn main
C:/vcpkg/installed/x64-windows/include/pplx/pplxtasks.h:222:104: note: in definition of macro 'PPLX_CAPTURE_CALLSTACK' 222 | #define PPLX_CAPTURE_CALLSTACK() ::pplx::details::_TaskCreationCallstack::_CaptureSingleFrameCallstack(_ReturnAddress())
C:/vcpkg/installed/x64-windows/include/pplx/pplxtasks.h: In instantiation of 'pplx::details::_Task_completion_event_impl<_ResultType>::~_Task_completion_event_impl() [with _ResultType = unsigned char]':
已尝试的无效操作
- 手动添加pplx库链接
- 删除CMake输出目录并重新生成
- 重装vcpkg及所有依赖
- 检查vcpkg路径与系统环境变量
解决思路
- 补充Windows CRT依赖:_ASSERTE是Windows CRT的断言宏,需确保编译时引入
<crtdbg.h>。可通过CMake全局配置强制定义相关宏:
target_compile_definitions(${PROJECT_NAME} PRIVATE _CRT_SECURE_NO_WARNINGS) target_include_directories(${PROJECT_NAME} PRIVATE ${VCPKG_ROOT}/installed/x64-windows/include)
也可在项目主头文件中直接包含<crtdbg.h>。
修正pplx编译宏定义:pplx库在vcpkg中的编译可能缺失Windows版本宏,尝试修改vcpkg中pplx的portfile.cmake,添加
-D_WIN32_WINNT=0x0601(对应Windows 7及以上),确保CRT功能正常启用。切换到MSVC工具链:CLion默认可能使用MinGW,但etcd-cpp-apiv3与pplx对MSVC支持更完善。在CLion中配置Toolchain为Visual Studio,重新生成CMake项目后编译。
显式链接pplx库:确保CMake正确识别pplx的配置文件,在CMake中添加:
find_package(pplx CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE etcd-cpp-api pplx)
- 降级etcd-cpp-apiv3版本:当前版本可能存在依赖兼容性问题,尝试安装旧版本,例如:
vcpkg install etcd-cpp-apiv3:x64-windows --version=0.1.5(版本号可根据vcpkg可用列表调整)。
内容的提问来源于stack exchange,提问作者jaimet

