Я пытаюсь использовать компилятор 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 не будет работать.
MinGW не ищет /usr/include
на самом деле хорошо. Библиотеки там могут не работать с MinGW.
Теперь сам nlohmann/json, содержащий только заголовки и не содержащий заголовков, сгенерированных для конкретной платформы, может работать как есть. Но попытка добавить -I/usr/include
к флагам (что позволит компилятору найти файл) вызовет огромные проблемы, так как все остальные заголовки также могут быть использованы.
Вместо этого вам следует самостоятельно клонировать nlohmann/json и добавить каталог include/
в репозиторий в путь поиска (с -I
).
Также есть квази-msys2, в котором есть менеджер пакетов для библиотек MinGW. Хотя для библиотек только для заголовков, которые не нужно компилировать, польза от их использования довольно мала (не нужно вручную клонировать репо и устанавливать путь включения). (Я автор.)
Если файл находится в /usr/include/nlohmann/json.hpp
и строка включения
#include <nlohmann/json.hpp>
то, что вам нужно, это -I/usr/include
.
Тогда он найдет nlohmann/json.hpp
под /usr/include
.
Обратите внимание, что это можно делать только в том случае, если это библиотека только для заголовков, которая не отличается для конкретной целевой платформы, для которой выполняется кросс-компиляция.
Как правило, вам нужно иметь библиотеки зависимостей, скомпилированные для одной и той же целевой платформы, и связать их. Это также причина, по которой кросс-компилятор не будет смотреть на вещи в /usr/include
.
Так как вы не можете выбрать, что тянуть из /usr/include
, в том числе это, вероятно, не лучшая идея.
@HolyBlackCat Да, я согласен
Спасибо за ваш ответ. Копирование заголовков в мой проект, пожалуй, лучшее решение. Говоря о библиотеках, у меня есть несколько статических библиотек типа Linux, которые я использую в своем проекте при работе в ОС Linux. Будут ли они также работать с MinGW? (Примет ли компоновщик MinGQ их и успешно свяжет с действительным файлом Exe) Или мне нужно как-то перекомпилировать статические библиотеки через MinGW?