#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