Каталоги зависимостей C между файлами

#c #compiler-errors #directory #dependencies

Вопрос:

У моего компилятора возникла проблема с поиском файлов в каталогах. Я на Windows 10.

Во-первых, мои файлы организованы таким образом:

  • C:/mingw64/bin/g (мой компилятор здесь)
  • C:/Users/Christophe/Documents/main.cpp (мое досье)
  • C:/Users/Christophe/Documents/SFML/include (мои файлы.hpp)
  • C:/Users/Christophe/Documents/SFML/lib (???)

У меня есть 9 файлов .hpp, которые:

  • Аудио.гэс
  • Конфигурация.ГЭС
  • GpuPreference.hpp
  • Графика.ГЭС
  • Главная.ГЭС
  • Сеть.ГЭС
  • OpenGL.гэс
  • Система.ГЭС
  • Окно.ГЭС

И у меня есть моя main.cpp это пример, чтобы увидеть, работает ли мой SMFL:

 #include <Graphics.hpp>

int main(){
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        window.clear();
        window.draw(shape);
        window.display();
    }
    return 0;
}
 

Проблема в том, что мой компилятор говорит: «Такого файла или каталога нет» с #include <SFML/Window.hpp><SFML/Window.hpp> красным цветом.

Я пытался найти решение с помощью VisualStudioCode с путями включения внутри моего .json в каждом файле .hpp, но это не работает.

Я также попытался на своем терминале ввести команду: g -I/SFML/включить main.cpp -о, но у меня ошибка выше.

Или: g -I/SFML/включает/** main.cpp -o EX, но на этот раз это #включить <SFML/System.hpp><SFML/System.hpp>, который выделен красным цветом.

Я не понимаю, почему он допустил эту ошибку, потому что я ее не включаю… Похоже, он не распознает мои пути или не имеет зависимости между .hpp. Возможно, решение находится внутри каталога «lib», но я не знаю, как его указать или манипулировать им.

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

Кристоф.

Комментарии:

1. ваш флаг-I должен указывать на папку, например-I/SFML/include Вы также, вероятно, захотите включить #include <SFML/Graphics.hpp> в свою основную. Следуйте инструкциям официального SFML, чтобы начать правильную настройку вашего проекта sfml-dev.org/tutorials/2.5

2. Спасибо вам за ваш ответ. Однако учебные пособия касаются кода::блока или старой версии VisualStudio. У меня нет их вариантов. Я пытаюсь создать «Make-файл» для связи моих библиотек.

Ответ №1:

на вашем месте я бы не стал утруждать себя созданием файла для создания.

Вместо этого я буду использовать cmake для создания файла makefile и позволю ему скомпилировать как мой код, так и SFML.

Если вы хотите сделать это таким образом, вы можете просто скачать cmake на их веб-сайте.

  • https://cmake.org/ не забудьте добавить cmake в переменную path, если вы находитесь в окне

затем в вашем проекте создайте файл с именем

  • CMakeLists.txt
  • Папка библиотеки, в которой у вас есть вся ваша библиотека
  • Исходная папка, в которой хранятся все исходные файлы
  • Папка сборки, в которой будет результат компиляции

в ваших списках CMakeLists скопируйте и вставьте этот код для sfml с помощью c 11

 cmake_minimum_required(VERSION 3.19)
project(ProjectNAME)

# Source files
set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source")
set(LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib")

#All the sources files listed
#List only the cpp file, header are automatically listed
set(SOURCES
        "${SRC_DIR}/main.cpp"
        )


# Executable definition and properties
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE "${SRC_DIR}")
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)

# SFML
set(SFML_DIR "${LIB_DIR}/SFML")

# this line is here to avoid having to move the dll into the build folder
set(BUILD_SHARED_LIBS FALSE)


add_subdirectory("${SFML_DIR}")
target_link_libraries(${PROJECT_NAME} sfml-graphics sfml-audio sfml-system sfml-window sfml-network)
 

Не забудьте положить свой main.cpp в исходной папке и папке SFML в папке Lib.
Обратите внимание, чтобы правильно назвать все папки в CMakeLists.txt

тогда, если вы работаете в Linux с gcc или g :

  • откройте свой терминал
  • перейдите в папку сборки
  • выполните команду « cmake .. «
  • подожди, пока все закончится
  • выполните команду « make «
  • подожди, пока все закончится
  • запустите свою программу с помощью « ./ProjectNAME «

если вы находитесь в окне с mingw (не забудьте добавить mingw в свой путь):

  • откройте свой терминал
  • перейдите в корневую папку
  • выполните команду « cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g -B build/Debug -DCMAKE_BUILD_TYPE=Debug «
  • подожди, пока все закончится
  • перейдите в папку сборки
  • выполните команду « mingw32-make -j «
  • подожди, пока все закончится
  • запустите свою программу с помощью « ProjectNAME.exe «

И все должно работать легко, без необходимости самостоятельно настраивать файл make. И если вы хотите узнать больше о cmake, у них есть отличная документация

Теперь вам просто нужно включить <SFML/graphics.hpp>

Комментарии:

1. Спасибо вам за ваш ответ. Я следую вашим инструкциям и застрял в переменной path для cmake. Его не нашли. Я скачал на (C:cmake) и я добавил в свою систему переменных пути, но она не распознает. Я пытался C:make и C:makeSource (потому что я думаю, что cmake здесь), но ничего. Я снова ищу.

2. Хорошо, я увидел, что у меня не было подходящего файла для моего cmake. Теперь все в порядке. Однако у меня есть ошибка, которую я пытаюсь устранить, и я думаю, что это будет хорошо. Там написано, что моих списков CMakeLists здесь нет.

3. Хорошо, я поставил CMakeLists.txt когда я назвал свой файл. Это ошибка. Мне просто нужно написать CMakeLists. Сейчас он компилируется, но у меня есть последняя ошибка: он остановился, потому что в моей папке lib/SFML нет списков CMakeList, и я не понимаю, почему у меня эта ошибка. Вы можете мне объяснить ? Спасибо.

4. можете ли вы отправить скриншот.

5. Кстати, чтобы убедиться, что у вас есть sfml в папке lib, вам следует загрузить его с github github.com/SFML/SFML и поместите его в папку lib