Определение пути включения для компилятора mingw

Я пытаюсь использовать компилятор Mingw в ОС Linux для кросс-компиляции в двоичные файлы Windows.

В очень простом проекте я использую один из них:

#include <nlohmann/json.hpp>

json.hpp находится в /usr/include/nlohmann. Когда я компилирую проект через g++, компилятор ищет пути включения по умолчанию и может без проблем найти заголовочный файл.

Однако, когда я компилирую проект через mingw, он использует разные пути включения, поэтому я должен указать путь включения явно. Я использую эту команду:

x86_64-w64-mingw32-g++ -I/usr/include/nlohmann --static main.cpp 

Но я получаю эту ошибку:

fatal error: nlohmann/json.hpp: No such file or directory
    2 | #include <nlohmann/json.hpp>

Кто-нибудь может мне помочь? ПРИМЕЧАНИЕ: файл json.hpp зависит от других файлов из папки nlohmann, поэтому включение только файла json.hpp не будет работать.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

MinGW не ищет /usr/include на самом деле хорошо. Библиотеки там могут не работать с MinGW.

Теперь сам nlohmann/json, содержащий только заголовки и не содержащий заголовков, сгенерированных для конкретной платформы, может работать как есть. Но попытка добавить -I/usr/include к флагам (что позволит компилятору найти файл) вызовет огромные проблемы, так как все остальные заголовки также могут быть использованы.

Вместо этого вам следует самостоятельно клонировать nlohmann/json и добавить каталог include/ в репозиторий в путь поиска (с -I).


Также есть квази-msys2, в котором есть менеджер пакетов для библиотек MinGW. Хотя для библиотек только для заголовков, которые не нужно компилировать, польза от их использования довольно мала (не нужно вручную клонировать репо и устанавливать путь включения). (Я автор.)

Спасибо за ваш ответ. Копирование заголовков в мой проект, пожалуй, лучшее решение. Говоря о библиотеках, у меня есть несколько статических библиотек типа Linux, которые я использую в своем проекте при работе в ОС Linux. Будут ли они также работать с MinGW? (Примет ли компоновщик MinGQ их и успешно свяжет с действительным файлом Exe) Или мне нужно как-то перекомпилировать статические библиотеки через MinGW?

Petr Morávek 25.04.2023 15:44

Если файл находится в /usr/include/nlohmann/json.hpp и строка включения

#include <nlohmann/json.hpp>

то, что вам нужно, это -I/usr/include.

Тогда он найдет nlohmann/json.hpp под /usr/include.

Обратите внимание, что это можно делать только в том случае, если это библиотека только для заголовков, которая не отличается для конкретной целевой платформы, для которой выполняется кросс-компиляция.

Как правило, вам нужно иметь библиотеки зависимостей, скомпилированные для одной и той же целевой платформы, и связать их. Это также причина, по которой кросс-компилятор не будет смотреть на вещи в /usr/include.

Так как вы не можете выбрать, что тянуть из /usr/include, в том числе это, вероятно, не лучшая идея.

HolyBlackCat 20.04.2023 21:20

@HolyBlackCat Да, я согласен

Petr Morávek 25.04.2023 15:42

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