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
相关产品推荐
相关产品推荐

