You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows8下vcpkg安装cpr库后编译链接失败求助

Windows下MinGW编译cpr库未定义引用问题解决

问题背景

我是C++新手,已通过vcpkg安装cpr库,使用以下代码在Windows 8 64位、MinGW编译器、VSCodium IDE环境下编译时出现大量未定义引用错误,但Ubuntu环境下可正常运行。

CMakeLists.txt

set (CMAKE_CXX_STANDARD 11)
set(VCPKG_TARGET_TRIPLET x64-mingw-dynamic)
include(path/vcpkg/scripts/buildsystems/vcpkg.cmake)

add_executable(Scrapy main.cpp)

find_package(cpr CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE cpr::cpr )

main.cpp

#include <cpr/cpr.h>
int main(int, char**) {

cpr::Response r = cpr::Get(cpr::Url{"https://docs.libcpr.org/"});
r.status_code;                  
r.header["content-type"];       
r.text;
printf("it works" );               
return 0;

}

编译错误日志片段

cpr::Session::Session():
[build] C:\msys64\vcpkg\buildtrees\cpr\x64-mingw-dynamic-dbg/C:/msys64/vcpkg/buildtrees/cpr/src/0ce00c60cd-ac486fb55d.clean/cpr/session.cpp:71: undefined reference to `operator new(unsigned long long)
[build] collect2: error: ld returned 1 exit status
[build] Build finished with exit code 2

解决方法

  • 确保vcpkg安装的cpr版本与triplet匹配
    执行以下命令重新安装对应triplet的cpr库,避免版本不兼容:

    vcpkg install cpr:x64-mingw-dynamic
    

    同时调整CMakeLists.txt中triplet设置的顺序,必须放在include(vcpkg.cmake)之前,确保triplet生效:

    set(VCPKG_TARGET_TRIPLET x64-mingw-dynamic)
    include(path/vcpkg/scripts/buildsystems/vcpkg.cmake)
    set(CMAKE_CXX_STANDARD 11)
    
  • 指定CMake使用MinGW编译器
    在CMakeLists.txt开头添加编译器指定,避免CMake误选其他编译器:

    set(CMAKE_C_COMPILER gcc)
    set(CMAKE_CXX_COMPILER g++)
    
  • 显式链接标准库
    MinGW环境下可能需要手动链接C++标准库,修改target_link_libraries:

    target_link_libraries(${PROJECT_NAME} PRIVATE cpr::cpr -lstdc++)
    

    同时强制启用C++11标准,添加:

    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
  • 清理缓存重建
    删除项目的build目录,重新运行CMake配置和编译,清除旧缓存带来的配置冲突。

内容的提问来源于stack exchange,提问作者Chota284689

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:20:32