Я попытался создать приложение погоды, используя cURL для запроса API и raylib для графического интерфейса, и обе библиотеки работали, пока я не объединил их.
Я подумал, что в конфигурации моего проекта есть ошибка, поэтому создал отдельный проект, в который включил только raylib и cURL/cURLpp без какого-либо другого кода:
#include "raylib.h"
#include "curlpp/cURLpp.hpp"
int main()
{
}
и когда я пытаюсь скомпилировать, я получаю такой вывод:
Build started at 6:43 PM...
1>------ Build started: Project: weatherCpp, Configuration: Debug x64 ------
1>weatherCpp.cpp
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\winuser.h(4710,1): error C2733: 'CloseWindow': you cannot overload a function with 'extern "C"' linkage
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\winuser.h(9328,1): error C2733: 'ShowCursor': you cannot overload a function with 'extern "C"' linkage
1>Done building project "weatherCpp.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build completed at 6:43 PM and took 02.010 seconds ==========
Я осмотрелся и знаю, что это из-за функций, объявленных с помощью extern "C", но я не знаю, что с этим делать, есть ли простой способ исправить это или мне нужно переключить библиотеки
*обе библиотеки скачаны с помощью vcpkg
**с использованием сравнения с 2022 годом
Проблема в том, что и raylib.h
, и winuser.h
содержат функции CloseWindow()
и ShowCursor()
, но с разными параметрами (потому что это совершенно разные несвязанные функции).
raylib.h
void CloseWindow(void);
Но:
winuser.h
BOOL CloseWindow(
[in] HWND hWnd
);
Вам нужно проверить, где в вашем исходном файле включен winuser.h (может быть, из заголовков завитков?)
@Олег, я пытался сделать то, что ты сказал: найти, откуда в моем исходном файле был включен winuser.h. Я сделал это, используя findstr /s /i /m \<"WinUser.h"\> *.*
из папки, где расположены библиотеки vcpkg, и кажется, что winuser.h можно найти во многих файлах, связанных с libcurl, поэтому я мог бы попробовать использовать что-то другое вместо cURLpp/cURL или, может быть, я попытаюсь каким-то образом разделить стороны запроса gui и http приложения (хотя не знаю, как, может быть, несколько проектов внутри одного решения? Я не знаю, поможет ли это)
@user25257007 user25257007 Я скачал github.com/datacratic/curlpp и не увидел включения winuser.h. Вам следует найти, что еще вызывает его включение. Возможно, есть и другие включения, которые могут включать winuser.h. Вы также можете запустить команду компилятора C++ «только для предварительной обработки» в своем файле «CL/P/C WeatherCpp.cpp», а затем вы увидите в выводе, откуда включен winuser.h.
Raylib - это беспорядок с совместимостью по отношению к Windows - не только рискует UB, но и сопровождающий предлагает решения для обхода, которые могут закончиться плохо. Есть несколько обходных путей, предлагаемых пользователями github.com/raysan5/raylib/issues/1217 libcurl использует windows.h на платформе Windows под капотом.
ЗАФИКСИРОВАННЫЙ:
Я разделил решение Visual Studio на два проекта: один использовался для cURL (статическая библиотека), а другой — для raylib (.exe). Я также поместил весь код cURL в пространство имен, и теперь я не получаю никаких ошибок и могу создать окно с помощью raylib и без проблем выполнять https-запросы с cURL
Мне помогло это видео
* Спасибо за всю помощь, кстати :)
Примечание, просто чтобы дать еще одну отправную точку для исследования спрашивающего: возможно, вы сможете избавиться от конфликтов, определив некоторые макросы.