Raylib + cURLpp == C2733 вы не можете перегрузить функцию с помощью 'extern "C"'

Я попытался создать приложение погоды, используя 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 годом

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что и raylib.h, и winuser.h содержат функции CloseWindow() и ShowCursor(), но с разными параметрами (потому что это совершенно разные несвязанные функции).

raylib.h

void CloseWindow(void);    

Но:

winuser.h

BOOL CloseWindow(
  [in] HWND hWnd
);

Вам нужно проверить, где в вашем исходном файле включен winuser.h (может быть, из заголовков завитков?)

Примечание, просто чтобы дать еще одну отправную точку для исследования спрашивающего: возможно, вы сможете избавиться от конфликтов, определив некоторые макросы.

Wutz 26.05.2024 20:49

@Олег, я пытался сделать то, что ты сказал: найти, откуда в моем исходном файле был включен winuser.h. Я сделал это, используя findstr /s /i /m \<"WinUser.h"\> *.* из папки, где расположены библиотеки vcpkg, и кажется, что winuser.h можно найти во многих файлах, связанных с libcurl, поэтому я мог бы попробовать использовать что-то другое вместо cURLpp/cURL или, может быть, я попытаюсь каким-то образом разделить стороны запроса gui и http приложения (хотя не знаю, как, может быть, несколько проектов внутри одного решения? Я не знаю, поможет ли это)

user25257007 26.05.2024 22:15

@user25257007 user25257007 Я скачал github.com/datacratic/curlpp и не увидел включения winuser.h. Вам следует найти, что еще вызывает его включение. Возможно, есть и другие включения, которые могут включать winuser.h. Вы также можете запустить команду компилятора C++ «только для предварительной обработки» в своем файле «CL/P/C WeatherCpp.cpp», а затем вы увидите в выводе, откуда включен winuser.h.

Oleg 27.05.2024 00:54

Raylib - это беспорядок с совместимостью по отношению к Windows - не только рискует UB, но и сопровождающий предлагает решения для обхода, которые могут закончиться плохо. Есть несколько обходных путей, предлагаемых пользователями github.com/raysan5/raylib/issues/1217 libcurl использует windows.h на платформе Windows под капотом.

Swift - Friday Pie 27.05.2024 03:38
Ответ принят как подходящий

ЗАФИКСИРОВАННЫЙ: Я разделил решение Visual Studio на два проекта: один использовался для cURL (статическая библиотека), а другой — для raylib (.exe). Я также поместил весь код cURL в пространство имен, и теперь я не получаю никаких ошибок и могу создать окно с помощью raylib и без проблем выполнять https-запросы с cURL
Мне помогло это видео
* Спасибо за всю помощь, кстати :)

Другие вопросы по теме